NPOI是一个开源的C#读写Excel、Word等微软OLE2组件文档的项目,可以在没有安装Office或者相应环境的机器上对WORD/EXCEL文档进行读写。NPOI是构建在POI 3.x版本之上的,它支持.NET Core平台,并且提供了一些扩展功能和便利方法。
本文将介绍如何在.NET Core中使用NPOI进行Excel文档的读写操作,包括以下几个方面:
读取Excel文件和Sheet
修改单元格和行数据
删除Sheet和行数据
写入Excel文件和Sheet
设置单元格样式和字体
一、读取Excel文件和Sheet
要读取Excel文件,首先需要引入NPOI相关的命名空间:
using NPOI.HSSF.UserModel; //HSSF用于操作Excel 2003以前(包括2003)的版本,扩展名为.xlsusing NPOI.XSSF.UserModel; //XSSF用于操作Excel 2007及以后版本,扩展名为.xlsxusing NPOI.SS.UserModel; //SS用于操作通用的Sheet对象
然后需要创建一个FileStream对象来打开要读取的Excel文件,并根据文件扩展名创建对应的Workbook对象:
//获取文件路径string filePath = @"D:\test.xlsx";
//获取文件扩展名string extensionName = System.IO.Path.GetExtension(filePath);
//创建文件流对象
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
//创建Workbook对象
IWorkbook workbook = null;
//根据扩展名判断是xls还是xlsx格式,并创建对应的HSSFWorkbook或XSSFWorkbook对象if (extensionName.Equals(".xls"))
{
workbook = new HSSFWorkbook(fileStream); //2003版本或以下
}
elseif (extensionName.Equals(".xlsx"))
{
workbook = new XSSFWorkbook(fileStream); //2007版本或以上
}
else
{
workbook = null;
}
fileStream.Close(); //关闭文件流对象
有了Workbook对象之后,就可以获取其中包含的Sheet对象了。有两种方式可以获取Sheet对象:
通过索引获取:ISheet sheet = workbook.GetSheetAt(index); index表示第几个Sheet,从0开始。
通过名称获取:ISheet sheet = workbook.GetSheet(name); name表示Sheet的名称。
如果要获取所有的Sheet对象,可以使用一个循环遍历Workbook中包含的所有Sheet:
//创建一个列表存储所有Sheet对象
List<ISheet> sheets = new List<ISheet>();
//获取Workbook中包含的Sheet数量int sheetCount = workbook.NumberOfSheets;
//遍历所有Sheet并添加到列表中for (int i = 0; i < sheetCount; i++)
{
sheets.Add(workbook.GetSheetAt(i));
}
二、修改单元格和行数据
要修改单元格或行数据,首先需要获取要修改的单元格或行所在的位置。可以通过以下方式获取:
获取指定位置的单元格:ICell cell = sheet.GetRow(rowNum).GetCell(cellNum); rowNum表示第几行,cellNum表示第几列,都从0开始。
获取指定位置的行:IRow row = sheet.GetRow(rowNum); rowNum表示第几行,从0开始。
有了单元格或行对象之后,就可以对其进行修改了。修改单元格数据有两种方式:
直接设置单元格值:cell.SetCellValue(value); value表示要设置的值
使用单元格样式对象:cell.CellStyle = cellStyle; cellStyle表示要设置的样式对象,可以通过Workbook.CreateCellStyle()方法创建,并设置相关属性。
修改行数据有两种方式:
修改行高:row.HeightInPoints = height; height表示要设置的行高
修改行内单元格数据:row.GetCell(cellNum).SetCellValue(value); cellNum表示第几列,value表示要设置的值
例如,如果要修改第二个Sheet中第三行第四列的单元格值为“Hello”,并将该单元格的字体颜色设为红色,可以使用以下代码:
//获取第二个Sheet
ISheet sheet = workbook.GetSheetAt(1);
//获取第三行
IRow row = sheet.GetRow(2);
//获取第四列
ICell cell = row.GetCell(3);
//设置单元格值为“Hello”
cell.SetCellValue("Hello");
//创建一个字体对象
IFont font = workbook.CreateFont();
//设置字体颜色为红色
font.Color = HSSFColor.Red.Index;
//创建一个单元格样式对象
ICellStyle cellStyle = workbook.CreateCellStyle();
//将字体对象应用到单元格样式对象中
cellStyle.SetFont(font);
//将单元格样式对象应用到单元格中
cell.CellStyle = cellStyle;
三、删除Sheet和行数据
要删除Sheet或行数据,首先需要获取要删除的Sheet或行所在的位置。可以通过以下方式获取:
获取指定位置的Sheet:ISheet sheet = workbook.GetSheetAt(index); index表示第几个Sheet,从0开始。
获取指定位置的行:IRow row = sheet.GetRow(rowNum); rowNum表示第几行,从0开始。
有了Sheet或行对象之后,就可以对其进行删除了。删除Sheet有两种方式:
通过索引删除:workbook.RemoveSheetAt(index); index表示第几个Sheet,从0开始。
通过名称删除:workbook.RemoveName(name); name表示Sheet的名称。
删除行有两种方式:
通过索引删除:sheet.RemoveRow(row); row表示要删除的行对象。
通过移动其他行覆盖来实现删除效果: sheet.ShiftRows(startRow, endRow, n); startRow表示开始移动的起始行索引, endRow表示结束移动的结束行索引, n表示移动多少个位置(负数向上移动,正数向下移动)。
例如,如果要删除第一个Sheet中第五到第七行(包括),可以使用以下代码:
//获取第一个Sheet
ISheet sheet = workbook.GetSheetAt(0);
//遍历要删除的每一行,并调用RemoveRow方法for (int i = 4; i <= 6; i++)
{
IRow row = sheet.GetRow(i);
sheet.RemoveRow(row);
}
或者
//获取第一个Sheet
ISheet sheet = workbook.GetSheetAt(0);
//将第八行及以后的所有行向上移动三个位置,覆盖掉原来的第五到第七行,并清除最后三个空白行(可选)
sheet.ShiftRows(7, sheet.LastRowNum, -3);
for (int i = sheet.LastRowNum - 2; i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
if (row != null)
{
sheet.RemoveRow(row);
}
}
四、写入Excel文件Sheet
要写入Excel文件和Sheet,首先需要创建一个Workbook对象,并根据文件扩展名创建对应的HSSFWorkbook或XSSFWorkbook对象:
//获取文件路径string filePath = @"D:\test.xlsx";
//获取文件扩展名string extensionName = System.IO.Path.GetExtension(filePath);
//创建Workbook对象
IWorkbook workbook = null;
//根据扩展名判断是xls还是xlsx格式,并创建对应的HSSFWorkbook或XSSFWorkbook对象if (extensionName.Equals(".xls"))
{
workbook = new HSSFWorkbook(); //2003版本或以下
}
elseif (extensionName.Equals(".xlsx"))
{
workbook = new XSSFWorkbook(); //2007版本或以上
}
else
{
workbook = null;
}
有了Workbook对象之后,就可以创建Sheet对象了。有两种方式可以创建Sheet对象:
通过索引创建:ISheet sheet = workbook.CreateSheet(); 创建一个空白的Sheet,并返回该Sheet对象。
通过名称创建:ISheet sheet = workbook.CreateSheet(name); name表示要给Sheet命名的名称。
如果要创建多个Sheet对象,可以使用一个循环遍历Workbook中包含的所有Sheet:
//定义一个数组存储要创建的Sheet名称string[] sheetNames = {"sheet1", "sheet2", "sheet3"};
//遍历数组并调用CreateSheet方法for (int i = 0; i < sheetNames.Length; i++)
{
ISheet sheet = workbook.CreateSheet(sheetNames[i]);
}
五、设置单元格样式和字体
要设置单元格样式和字体,首先需要创建一个ICellStyle对象和一个IFont对象,并设置相关属性:
//创建一个单元格样式对象
ICellStyle cellStyle = workbook.CreateCellStyle();
//设置单元格水平居中对齐
cellStyle.Alignment = HorizontalAlignment.Center;
//设置单元格垂直居中对齐
cellStyle.VerticalAlignment = VerticalAlignment.Center;
//设置单元格背景颜色为黄色(注意需要同时设置FillForegroundColor和FillPattern属性)
cellStyle.FillForegroundColor = HSSFColor.Yellow.Index;
cellStyle.FillPattern = FillPattern.SolidForeground;
//设置单元格边框为细实线,并且颜色为黑色(注意需要分别设置上下左右四个方向的边框样式和颜色)
cellStyle.BorderTop= BorderStyle.Thin;
cellStyle.BorderBottom= BorderStyle.Thin;
cellStyle.BorderLeft= BorderStyle.Thin;
cellStyle.BorderRight= BorderStyle.Thin;
cellStyle.TopBorderColor= HSSFColor.Black.Index;
cellStyle.BottomBorderColor= HSSFColor.Black.Index;
cellStyle.LeftBorderColor= HSSFColor.Black.Index;
cellStyle.RightBorderColor= HSSFColor.Black.Index;
//创建一个字体对象
IFont font = workbook.CreateFont();
//设置字体为宋体,大小为12,加粗,颜色为红色,斜体,带下划线和删除线(注意需要分别设置各个属性)
font.FontName="宋体";
font.FontHeightInPoints=12;
font.IsBold=true;
font.Color=HSSFColor.Red.Index;
font.IsItalic=true;
font.Underline= FontUnderlineType.Single;
font.IsStrikeout=true;
//将字体对象应用到单元格样式对象中(注意这一步是必须的,否则字体不会生效)
cellStyle.SetFont(font);
有了单元格样式和字体对象之后,就可以将其应用到具体的单元格中了。有两种方式可以应用单元格样式和字体:
在创建单元格时直接指定:ICell cell = row.CreateCell(cellNum, CellType.String, cellValue, cellstyle); cellNum表示第几列, CellType表示单元格类型, cell
在创建单元格之后再指定:cell.CellStyle = cellStyle; cell表示要设置的单元格对象,cellStyle表示要设置的样式对象。
例如,如果要给第一个Sheet中第一行第一列的单元格设置上面定义的样式和字体,可以使用以下代码:
//获取第一个Sheet
ISheet sheet = workbook.GetSheetAt(0);
//获取第一行
IRow row = sheet.GetRow(0);
//获取第一列
ICell cell = row.GetCell(0);
//将样式和字体应用到单元格中
cell.CellStyle = cellStyle;
六、写入Excel文件
要写入Excel文件,首先需要创建一个FileStream对象,并指定文件路径和模式:
//获取文件路径string filePath = @"D:\test.xlsx";
//创建文件流对象
FileStream fileStream = new FileStream(filePath, FileMode.Create);
有了FileStream对象之后,就可以调用Workbook的Write方法将Workbook内容写入到文件流中:
//将Workbook内容写入到文件流中
workbook.Write(fileStream);
最后,需要关闭文件流和Workbook对象:
//关闭文件流和Workbook对象
fileStream.Close();
workbook.Close();
这样就完成了对Excel文件的写入操作。