.NET、C#使用NPOI创建EXCEL表格,基础及进阶用法,一篇文章解决所有使用场景。
前提:NPOI包为:
引用:
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.Util;
第一步:创建表格
IWorkbook wk = new XSSFWorkbook();
第二步:创建工作表
ISheet sheet = wk.CreateSheet("Sheet1");
第三步:创建行
int rowNum = 0; IRow row = sheet.CreateRow(rowNum);
第四步:创建行单元格
var cell=row.CreateCell(0).SetCellValue("序号");
第五步:对单元格进行赋值
cell.SetCellValue("序号");
第六步:写入文件流
var ms = new MemoryStream(); wk.Write(ms);
第七步:保存成文件
// 定义保存文件的路径和文件名 string filePath = "output.xlsx"; // 使用FileStream创建或覆盖文件,并将MemoryStream中的数据写入文件 using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { ms.CopyTo(fileStream); }
或者直接返回下载流:
var buffer = ms.ToArray(); return File(buffer, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "文件名.xlsx");
到这,一个使用NPOI创建excel基本表格的功能就写完了。
进阶一:如果你还想添加样式:
XSSFCellStyle headStyle = (XSSFCellStyle)wk.CreateCellStyle(); headStyle.WrapText = true; headStyle.Alignment = HorizontalAlignment.Center; headStyle.VerticalAlignment = VerticalAlignment.Center; IFont font = wk.CreateFont(); font.FontName = "Arial"; font.FontHeightInPoints = 12; font.IsBold = true; headStyle.SetFont(font); headStyle.BorderTop = BorderStyle.Thin; headStyle.TopBorderColor = IndexedColors.Black.Index; headStyle.BorderBottom = BorderStyle.Thin; headStyle.BottomBorderColor = IndexedColors.Black.Index; headStyle.BorderLeft = BorderStyle.Thin; headStyle.LeftBorderColor = IndexedColors.Black.Index; headStyle.BorderRight = BorderStyle.Thin; headStyle.RightBorderColor = IndexedColors.Black.Index;
一般excel表格第一行表头样式单独处理,以上为excel表格表头的样式
以下为excel表格表体的样式
ICellStyle style = wk.CreateCellStyle(); style.Alignment = HorizontalAlignment.Center; style.VerticalAlignment = VerticalAlignment.Center; style.WrapText = true; style.BorderTop = BorderStyle.Thin; style.TopBorderColor = IndexedColors.Black.Index; style.BorderBottom = BorderStyle.Thin; style.BottomBorderColor = IndexedColors.Black.Index; style.BorderLeft = BorderStyle.Thin; style.LeftBorderColor = IndexedColors.Black.Index; style.BorderRight = BorderStyle.Thin; style.RightBorderColor = IndexedColors.Black.Index;
把excel样式赋值给单元格:
cell.CellStyle = headStyle; cell.CellStyle = style;
excel表格样式属性就不一一解释说明了。
进阶二:如果你想合并单元格:
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 6));
原始方法为:
public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
看传参字段名称信息能一目了然应该怎么传参合并单元格。
进阶三:设置高宽
row2.HeightInPoints = 25; sheet.SetColumnWidth(0, 12 * 256);
设置宽度原始方法:
void SetColumnWidth(int columnIndex, double width);
至于为什么要*256请自己摸索。
进阶四:如果你想插入图片:
var pic1ms = new MemoryStream(); int pictureIdx = wk.AddPicture(pic1ms.ToArray(), ie.target.FileExt.Contains("png") ? PictureType.PNG : ie.target.FileExt.Contains("jpg") || ie.target.FileExt.Contains("jpeg") ? PictureType.JPEG : PictureType.BMP);//这里type很重要,type错了,显示不出来 IDrawing drawing = sheet.CreateDrawingPatriarch(); IClientAnchor anchor = drawing.CreateAnchor(47621, 47621, 1592571, 1536280, colNum, rowNum, colNum, rowNum); // 调整位置和大小,这一步的计算方式太复杂了,不想进行说明,请自行摸索 IPicture pict = drawing.CreatePicture(anchor, pictureIdx);
CreateAnchor 原始方法如下:
/// Creates a new client anchor and sets the top-left and bottom-right /// coordinates of the anchor. /// /// @param dx1 the x coordinate in EMU within the first cell. /// @param dy1 the y coordinate in EMU within the first cell. /// @param dx2 the x coordinate in EMU within the second cell. /// @param dy2 the y coordinate in EMU within the second cell. /// @param col1 the column (0 based) of the first cell. /// @param row1 the row (0 based) of the first cell. /// @param col2 the column (0 based) of the second cell. /// @param row2 the row (0 based) of the second cell. /// @return the newly created client anchor IClientAnchor CreateAnchor( int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2);
注释机器翻译:
创建新的客户端锚点并设置左上角和右下角 锚点的坐标。 /// @param dx1 第一个单元格内 EMU 中的 x 坐标。 @param dy1 第一个单元格内 EMU 中的 y 坐标。 @param dx2 第二个单元内 EMU 中的 x 坐标。 @param dy2 第二个单元内 EMU 中的 y 坐标。 @param col1 第一个单元格的列(从 0 开始)。 @param row1 表示第一个单元格的行(从 0 开始)。 @param col2 第二个单元格的列(从 0 开始)。 @param row2 第二个单元格的行(从 0 开始)。 @return新创建的客户端锚点
难点在于 EMU 的计算,自行摸索吧。
到这里,一个基本的使用NPOI生成excel就完成了,应该能满足很多需求了,收工。