C#【必备技能篇】使用NPOI实现对excel的读取和写入

这篇具有很好参考价值的文章主要介绍了C#【必备技能篇】使用NPOI实现对excel的读取和写入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、Winform界面布局

C#【必备技能篇】使用NPOI实现对excel的读取和写入

2、引用NPOI的dll

C#【必备技能篇】使用NPOI实现对excel的读取和写入
C#【必备技能篇】使用NPOI实现对excel的读取和写入

3、源码

using NPOI.HSSF.UserModel;//HSSFWorkbook,97-2003版本,excel文件后缀为.xls
using NPOI.SS.UserModel;//IWorkbook,ISheet,IRow,ICell,DateUtil需要此引用
using NPOI.XSSF.UserModel;//XSSFWorkbook,2007版本,excel文件后缀为.xlsx
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public static DataTable NPExcelToDataTable(string fileName, string sheetName = "")
        {
            FileStream fs = null;
            IWorkbook workbook = null;//IWorkbook是一个接口,XSSFWorkbook和HSSFWorkbook都继承自此接口
            ISheet sheet = null;//ISheet也是一个接口
            DataTable dt = new DataTable();
            try
            {
                //【1】读取excel文件,并新建workbook和sheet
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                if (fileName.IndexOf(".xlsx") > 0)      // 2007版本
                    workbook = new XSSFWorkbook(fs);
                else if (fileName.IndexOf(".xls") > 0)  // 97-2003版本
                    workbook = new HSSFWorkbook(fs);
                //workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fs);
                if (sheetName != "")                    //是否有传入表名
                {
                    sheet = workbook.GetSheet(sheetName);
                }
                else
                {
                    sheet = workbook.GetSheetAt(0);    //读取第一个sheet
                }

                //【2】解析excel文件的内容,填充到dt中
                if (sheet == null)//工作表中的内容为null时
                {
                    throw new Exception("未找到工作表");
                }

                dt.TableName = sheet.SheetName;

                //解析sheet的第一行数据,添加dt的列头名
                int startRow = 0;   //开始读取行数 
                IRow firstRow = sheet.GetRow(startRow);   //第一行 
                int cellCount = firstRow.LastCellNum;     //一行最后一个cell的编号,即总的列数
                for (int i = firstRow.FirstCellNum; i < cellCount; i++)
                {
                    ICell cell = firstRow.GetCell(i);
                    if (cell != null)
                    {
                        string cellValue = cell.StringCellValue;
                        if (cellValue != null)
                        {
                            if (dt.Columns.IndexOf(cellValue) > 0)  //如果已经有此列名,则结果>0,列名名称加上“重复列名”和"列的列数i"
                            {
                                DataColumn column = new DataColumn(Convert.ToString("重复列名" + cellValue + i));
                                dt.Columns.Add(column); 
                            }
                            else
                            {
                                DataColumn column = new DataColumn(cellValue);
                                dt.Columns.Add(column);
                            }
                        }
                    }
                }

                //添加dt的所有行内容
                startRow = startRow + 1;
                int rowCount = sheet.LastRowNum;      //总行数                                                     
                for (int i = startRow; i <= rowCount; i++)
                {
                    IRow row = sheet.GetRow(i);
                    if (row == null) continue; //没有数据的行默认是null

                   DataRow dataRow = dt.NewRow();
                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        ICell cell = row.GetCell(j);
                        if (cell != null)        //同理,没有数据的单元格都默认是null
                        {
                            if (cell.CellType == CellType.Formula)   //公式时
                            {
                                try
                                {
                                    dataRow[j] = cell.StringCellValue;
                                }
                                catch
                                {
                                    if (DateUtil.IsCellDateFormatted(cell))   //日期时
                                    {
                                        dataRow[j] = cell.DateCellValue;
                                    }
                                    else { dataRow[j] = cell.NumericCellValue; }//数字时
                                }
                            }
                            else { dataRow[j] = cell.ToString(); }
                        }
                    }
                    dt.Rows.Add(dataRow);
                }

                //使用完excel文件后,一定要关闭
                fs.Close();
                return dt;
            }
            catch (Exception ex)
            {
                if (fs != null)
                {
                    fs.Close();
                }
                throw new Exception(ex.Message);
            }
        }

        //导入excel数据到datagridview
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                DataTable dt = new DataTable();
                dt = NPExcelToDataTable(txt_Path.Text, "");
                dataGridView1.DataSource = dt;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }

        //打开文件
        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Excel文件|*.xls;*.xlsx";//设置打开文件筛选器
            openFileDialog1.Title = "选择Excel文件";//设置打开对话框标题
            openFileDialog1.Multiselect = false;//设置打开对话框中只能单选
            if (openFileDialog1.ShowDialog() == DialogResult.OK)//判断是否选择了文件
            {
                txt_Path.Text = openFileDialog1.FileName;//在文本框中显示Excel文件名
            }
        }

        //添加一行内容并保存到excel
        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                HSSFWorkbook wk = new HSSFWorkbook();
                //创建一个sheet
                ISheet sheet = wk.CreateSheet("例子");
                //在第一行创建行
                IRow row = sheet.CreateRow(0);
                //在第一行的第一列创建单元格
                for (int i = 0; i < 10; i++)
                {
                    ICell cell = row.CreateCell(i);
                    cell.SetCellValue("测试" + i);
                }

                using (FileStream fs = File.OpenWrite(".\\excel.xls"))
                {
                    wk.Write(fs);
                }
                MessageBox.Show("已新建和保存excel文件");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //更改excel中第一行的数据(除了列头)
        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                string tempPath = ".\\excel.xls";
                HSSFWorkbook wk = null;
                using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    wk = new HSSFWorkbook(fs);
                    fs.Close();
                }
                //选定名为"例子"的sheet    
                ISheet sheet = wk.GetSheet("例子");
                //在第二行创建单元格 
                IRow row = sheet.CreateRow(1);
               //为第二行中前10列赋值
                for (int i = 0; i < 10; i++)
                {
                    ICell cell = row.CreateCell(i);
                    cell.SetCellValue("SS" + i);
                }

                //将编辑值后的workbook保存到excel中
                using (FileStream fileStream = File.Open(".\\excel.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    wk.Write(fileStream);
                    fileStream.Close();
                }
                MessageBox.Show("成功编辑excel中的值");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //更改excel中第一行的单元格样式(除了列头)
        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                HSSFWorkbook wk = null;
                string tempPath = ".\\excel.xls";
                using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    wk = new HSSFWorkbook(fs);
                    fs.Close();
                }
                ICellStyle cellStyle = wk.CreateCellStyle();
                //设置单元格上下左右边框线 
                cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
                cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.SlantedDashDot;
                cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.SlantedDashDot;
                cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.SlantedDashDot;
                //文字水平和垂直对齐方式  
                cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                //是否换行  
                //cellStyle.WrapText = true;  
                //缩小字体填充  
                cellStyle.ShrinkToFit = true;

                //选定名为"例子"的sheet    
                ISheet sheet = wk.GetSheet("例子");

                //在第二行创建单元格 
                IRow row = sheet.GetRow(1);
                //为第二行中前10列赋值
                for (int i = 0; i < 10; i++)
                {
                    ICell cell = row.GetCell(i);
                    cell.CellStyle = cellStyle;
                }

                //将编辑值后的workbook保存到excel中
                using (FileStream fileStream = File.Open(".\\excel.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    wk.Write(fileStream);
                    fileStream.Close();
                }
                MessageBox.Show("格式设置成功,请打开excel文件查看");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        //读取excel中第1列第1行的值(除了列头)
        private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                string ExcelFilePath = ".\\excel.xls";

                NPOI.SS.UserModel.IWorkbook wk = null;
                using (FileStream fs = File.Open(ExcelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    if (ExcelFilePath.IndexOf(".xlsx") > 0) // 2007版本
                        wk = new NPOI.XSSF.UserModel.XSSFWorkbook(fs);
                    else if (ExcelFilePath.IndexOf(".xls") > 0) // 97-2003版本
                        wk = new NPOI.HSSF.UserModel.HSSFWorkbook(fs);
                    fs.Close();
                }
               
                ISheet sheet = wk.GetSheetAt(0);//获取第一个sheet
                //int count = wk.NumberOfSheets;//获取一个excel文件中sheet的总数
                textBox1.Text = sheet.GetRow(0).GetCell(0).StringCellValue;//获取第一行第一列的值
                MessageBox.Show("成功读取excel中的值");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

4、运行效果

依次执行下图中的1-6按钮
可以通过查看程序文件夹中的excel文件来加深理解。
C#【必备技能篇】使用NPOI实现对excel的读取和写入
C#【必备技能篇】使用NPOI实现对excel的读取和写入

5、NPOI的dll下载地址

链接:https://pan.baidu.com/s/19PgQMhCKviw9aBAjmJHSww
提取码:2omi
C#【必备技能篇】使用NPOI实现对excel的读取和写入

6、补充【以上步骤只能打开.xls文件(97-2003版本),打不开.xlsx文件(2007版本)】

需要在源码中增加如下引用。相应的dll已更新到5的下载地址中。
C#【必备技能篇】使用NPOI实现对excel的读取和写入文章来源地址https://www.toymoban.com/news/detail-412023.html

到了这里,关于C#【必备技能篇】使用NPOI实现对excel的读取和写入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# .NET读取和写入Excel表数据(手把手教)

    (1)首先在程序:“引用”右键--点击“管理NuGet程序包” (我这里是已经引入过了,所以会显示引用中有NPOI)   (2)在“浏览”处搜索“NPOI”,选择适当版本安装(需要联网)   (3)在程序中引入相应的命名空间,编写读取excel表格的封装代码(万能) (4)调用上述读取

    2024年02月11日
    浏览(46)
  • 【办公软件】C#调用NPOI实现Excel文件的加载、导出功能

    本文将介绍如何使用C#和NPOI库实现Excel文件的读写操作,并通过加载文件和导出文件的按钮进行封装。NPOI是一个强大的.NET库,可以轻松处理Excel文件。我们将学习如何使用NPOI打开现有的Excel文件、读取数据,并将数据写入到Excel文件中。 在开始之前,请确保已安装以下环境:

    2024年02月06日
    浏览(53)
  • C# NPOI操作Excel汇总

    C#操作Excel有多种方法,如通过数据库的方式来读写Excel的OleDb方式,但是OleDb方式需要安装微软office,还可以通过COM组件方式操作Excel,也需要安装微软Excel。如果不想安装微软办公套餐可以使用ClosedXML、EPPlus、NPOI。本文主要是介绍NPOI的常用使用方法。 Apache POI是Apache软件基金

    2024年02月12日
    浏览(46)
  • C#读写导入导出Excel表格模板(NPOI)

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。 1、您可以完全免费使用该框架 2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等) 3、专业的技

    2023年04月08日
    浏览(38)
  • Apache POI实现Excel导入读取数据和写入数据并导出

    Apache POI POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。 maven坐标: POI结构: 入门案例 ExcelTest .java文件 从Excel文件读取数据

    2024年02月12日
    浏览(46)
  • C#基础:用ClosedXML实现Excel写入

    直接在控制台输出,确保安装了该第三方库 实现效果:

    2024年01月24日
    浏览(32)
  • C# WinForm 使用Microsoft.Office.Interop.Excel对Excel文件表格的单元格值进行修改操作

    在引用位置点击右键 点击管理NUGet程序包 搜索Excel,在搜索结果中点击Microsoft.Office.Interop.Excel 然后点击安装即可,搜不到的话,在右侧程序包源位置改成全部再次搜索 。 对准项目,点击右键,在弹出菜单选择添加,选择类 类名称随意,然后清空新建类得到全部内容,把下面

    2024年02月13日
    浏览(58)
  • 深入解析C#中的第三方库NPOI:Excel和Word文件处理的利器

    一、引言 在.NET开发中,操作Office文档(特别是Excel和Word)是一项常见的需求。然而,在服务器端或无Microsoft Office环境的场景下,直接使用Office Interop可能会面临挑战。为了解决这个问题,开源库NPOI应运而生,它提供了无需安装Office即可创建、读取和修改Excel (.xls, .xlsx) 和

    2024年03月18日
    浏览(45)
  • (必备技能)使用Python实现屏幕截图

    在csdn上有很多纯copy,这给我复现带来了很大的麻烦,所以我想根据我的个人找截图的经历记录下来,给未来的自己看,免得忘记了云云。 由于我比较喜欢用opencv处理图像,所以截屏最后都会附带一个使用opencv显示图片的一个步骤。 1、下载pyautogui包 注:使用pyautogui方法获取

    2024年02月07日
    浏览(46)
  • winform读取Excel文件中数据内容

    效果  

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包