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();
}
}
}