C#读写工作表(3)——引用 NPOI进行数据读写

NPOI 是一个 open-source.NET 框架库,它提供了广泛的 API 来管理 Excel 文档,使其成为开发人员自动执行涉及电子表格的操作的绝佳选择。利用 NPOI,可以有效地操作数据、添加格式、读取现有 Excel 文件和添加公式。它为 C# 应用程序中的 Excel 集成提供了可靠的解决方案,并且经过积极维护和免费使用,为开发人员节省了时间和资源。

1、读取xlsx文件中的数据

1.1、添加引用

在使用NPOI之前,先打开VS 的 NuGet包管理器,搜索并下载NPOI。
在这里插入图片描述

1.2、读取数据内容

在使用NPOI对工作表进行操作时,使用 DataTable 类是非常便捷的方式,可以直接锁定一整行或者一整列数据,其实际作用相当于一个中转站,将工作表中的内容,复制存入一个数据表当中,当程序后续操作可以直接调用该数据表,而不需要再去每次读取excel文件。

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;	//xlsx文件使用该类
using System.Data;

namespace _005_读写Excel表格数据
{
    internal class Program
    {
     #region 读取Excel数据
        public static DataTable Shuju(string fileName,string sheetName)
        //定义一个返回类型为DataTable 类的方法(fileName:文件路径;sheetName:excel工作簿sheet的名称)
        {
            IWorkbook workbook = null;	//定义一个工作簿
            ISheet sheet = null;        //定义一个工作表
            DataTable data = new DataTable();	//定义一个DataTable 类的数据表 
            int columncount = 0;    //列数 
            int rowcount = 0;       //行数 
            FileStream fs;
            try
            {
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                //判断输入指定的Excel文件是什么后缀,方才可以采用对应的数据流方法进行数据的读取
                if(fileName.IndexOf(".xlsx")>0)         //xlsx文件
                {
                    workbook = new XSSFWorkbook(fs);
                }
                else if(fileName.IndexOf(".xls") > 0)   //xls文件
                {
                    workbook = new HSSFWorkbook(fs);
                }
                
                //根据指定的工作表名称来获得其数据,如果未指定工作表,即sheetName的值为null,便默认读取第一个工作表的数据 
                if(sheetName!=null)
                {
                    sheet = workbook.GetSheet(sheetName);       //根据给定的sheet名称获取数据
                }
                else
                {
                    //也可以根据sheet编号来获取数据
                    sheet = workbook.GetSheetAt(0);
                    //获取第几个sheet表(此处表示如果没有给定sheet名称,默认是第一个sheet表)
                }

                //如果工作表不为空,则通过下列代码完成对工作表的读取,并且将读取到的数据存入DataTable中
                if(sheet!=null)
                {
                    IRow firstrow = sheet.GetRow(0);        
                    //使用NPOI库时,行和列的索引都从0开始
                    columncount = firstrow.LastCellNum;	//第一行最后一个cell的编号便是列的总数

                    //在 Datatable中创建足够多的列,防止下面读写数据时,索引超额
                    for (int k = 0; k < columncount; k++)
                    {
                        data.Columns.Add("Column" + k, typeof(string));
                    }                    
                    //也可直接使用 sheet.GetRow(i)方法与双重循环,来获取每一个单元格的数据,而不用采用 DataTable 工作表

                    rowcount = sheet.LastRowNum;        //行数,最后一行的编号便是行总数 
                    for(int i=0;i<=rowcount;++i)
                    {
                        IRow row = sheet.GetRow(i);     //获得sheet工作表中的每一行
                        if(row==null)
                        {
                            continue;       //没有数据的行,统一默认为null
                        }
                        //将excel表每一行的数据添加到datatable的行中
                        DataRow dataRow = data.NewRow();    //定义一个DataROw类(数组形式,表示一行数据)                                        
                        for (int j=0;j<columncount;j++)		//每行当中,一个单元格一个单元格的读取数据
                        {
                            //与上面一样,当单元格里面没有数据时,则默认是null,有数据时则存入相应的dataRow数组的位置中
                            if(row.GetCell(j)!=null)
                            {                         
                                string cell = row.GetCell(j).ToString();	//获得sheet工作表中每行的数据
                                dataRow[j] = cell;							//将其存入dataRow数组当中
                            }
                        }
                       data.Rows.Add(dataRow); 	
                       //将dataRow数组写入相应的行里面,达到将sheet表格一行数据转换到dataTable中的功能
                    }
                }
                return data;
            }
            catch(Exception ex)
            {
                Console.WriteLine("Exception:" + ex.Message);
                return null;
            }
        }
     #endregion
            
        static void Main(string[] args)
        {
            DataTable dt = Shuju("C:\\Users\\Administrator\\Desktop\\test.xlsx","Sheet1");
            if(dt!=null)
            { 
                foreach(DataRow row in dt.Rows) //对数据表的每行进行遍历
                {
                    for(int i=0;i<dt.Columns.Count;i++)
                    {
                        Console.Write(row[i]+" ");		//在控制台显示每行的数据
                    }
                    Console.WriteLine();	//空一行
                }
            }
            else
            {
                Console.WriteLine("DataTable is null. Unable to read data from Excel file.");
            }
        }
    }
}

2、向xlsx文件中写入数据

写与读类似,也可以使用DataTable工作表来实现。但是,我们也可以直接对sheet表格中的单元格进行操作,完成读写,而不使用DataTable。

using NPOI.HPSF;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections.Generic;

namespace _007_写入Excel表格数据
{
    internal class Program
    { 
        static void Main(string[] args)
        {
            XSSFWorkbook workbook = new XSSFWorkbook();		//新建工作簿
            workbook.CreateSheet("Sheet1");		//新建一个Sheet工作表
            XSSFSheet sheetone = (XSSFSheet)workbook.GetSheet("Sheet1");	//获取名称为Sheet1的工作表
            
            //对工作表先添加行,索引从0开始
            for(int i=0;i<10;i++)
            {
                sheetone.CreateRow(i);      //创建10行 
            }
            
            XSSFRow sheetrow = (XSSFRow)sheetone.GetRow(0);     //获取Sheet1工作表的首行
            XSSFCell[] sheetcell = new XSSFCell[10];
            for(int i=0;i<10;i++)
            {
                sheetcell[i] = (XSSFCell)sheetrow.CreateCell(i);
                //为第一行创建10个单元格
            }

            //创建之后开始赋值
            sheetcell[0].SetCellValue(true);                    
            sheetcell[1].SetCellValue(0.000001);               
            sheetcell[2].SetCellValue("Excel2010");              
            sheetcell[3].SetCellValue("12345678987654321");    

            for(int i=4;i<10;i++)
            {
                sheetcell[i].SetCellValue(i);   //循环将其余6列设置整数4——9
            }

            FileStream file = new FileStream(@"C:\Users\Administrator\Desktop\Excel2010.xlsx", FileMode.Create);
            workbook.Write(file);
            file.Close();
            workbook.Close();
        }
    }
}
  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NPOIC#中一个开源的Excel读写库,可以帮助我们实现Excel读取和写入操作。具体使用方法如下: 1. 安装NPOI库 在Visual Studio中打开NuGet包管理器,搜索NPOI,找到“NPOI”和“NPOI.OOXML”,安装这两个库。 2. 读取Excel 使用NPOI读取Excel需要先打开Excel文件,然后获取工作簿和工作,最后读取单元格的值。示例代码如下: ``` using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; // 打开Excel文件 FileStream fs = new FileStream("test.xlsx", FileMode.Open); XSSFWorkbook workbook = new XSSFWorkbook(fs); // 获取第一个工作 ISheet sheet = workbook.GetSheetAt(0); // 读取第一行第一列的单元格值 IRow row = sheet.GetRow(0); ICell cell = row.GetCell(0); string value = cell.StringCellValue; // 关闭流 fs.Close(); ``` 3. 写入Excel 使用NPOI写入Excel需要先创建工作簿和工作,然后创建单元格并设置值,最后保存Excel文件。示例代码如下: ``` using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; // 创建Excel文件 XSSFWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建第一行 IRow row = sheet.CreateRow(0); // 创建第一列并设置值 ICell cell = row.CreateCell(0); cell.SetCellValue("Hello World"); // 保存Excel文件 FileStream fs = new FileStream("test.xlsx", FileMode.Create); workbook.Write(fs); // 关闭流 fs.Close(); ``` 以上就是NPOI的使用方法,希望能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值