.NET Core使用NPOI的例子

.NET Core使用NPOI的例子_第1张图片

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 sheets = new List();
//获取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文件的写入操作。

你可能感兴趣的:(.netcore,excel,c#)