NPOI是一个供给C#操作导入或导出Excel的开源工具
.NET版本:.NET 5
NPOI版本:2.6.0
类名 | 描述 | 命名空间 |
---|---|---|
IWorkbook | 工作薄 | NPOI.SS.UserModel |
ISheet | 工作表 | NPOI.SS.UserModel |
IRow | 行 | NPOI.SS.UserModel |
ICell | 单元格 | NPOI.SS.UserModel |
IWorkbook 为创建的工作薄对象,一切工作薄内的操作都源自于它。
创建工作薄,代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
IWorkbook workbook_xls = new HSSFWorkbook(); // 创建.xls工作薄
这里用到了两个不同的方法来创建Excel工作薄
方法名 | 命名空间 |
---|---|
XSSFWorkbook() | NPOI.XSSF.UserModel |
HSSFWorkbook() | NPOI.HSSF.UserModel |
ISheet 为创建的工作表对象,Excel要求一个工作薄内至少要有一个工作表。
创建工作表代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
这里使用到了工作薄的一个方法 CreateSheet(string sheetName),sheetName为创建的工作表的名称。
合并单元格操作需要在工作表中进行,这里使用到了这个方法
ISheet.AddMergedRegion(new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastRow))
属性 | 描述 |
---|---|
firstRow | 起始行,从0开始 |
lastRow | 结束行 |
firstCol | 起始列,从0开始 |
lastCol | 结束列 |
示例代码如下
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 合并A1和A2单元格
部分方法如下
方法 | 描述 | 参数描述 |
---|---|---|
SetColumnWidth(int columnIndex, int width) | 设置列宽度 | columnIndex:设置的列,从0开始 width:设置的宽度,1/256 个点 |
IRow 为工作表创建的行对象
创建行代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
IRow row = sheet.CreateRow(0); // 创建第1行,参数为第几行
这里使用到了工作表的一个方法 CreateRow(int rownum),rownum为创建的行,从0开始。
IRow 的部分属性如下
属性 | 类型 | 描述 | 可选值 |
---|---|---|---|
Height | short | 行高 | 单位是 1/20 个点 |
ICell 为行创建的单元格对象
创建单元格,代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
IRow row = sheet.CreateRow(0); // 创建第1行,参数为第几行
cell = row.CreateCell(0); // 创建第1行的第1个单元格,参数为第几列
这里使用到了行的一个方法 CreateCell(int column),column为创建的列,从0开始。
方法名 | 描述 |
---|---|
SetCellValue(bool value) | 给单元格赋值,赋布尔值 |
SetCellValue(string value) | 给单元格赋值,赋字符串值 |
SetCellValue(IRichTextString value) | 给单元格赋值,赋字符串值 |
SetCellValue(DateTime value) | 给单元格赋值,赋日期值 |
SetCellValue(double value) | 给单元格赋值,赋浮点数值 |
样式只能应用于单元格,所以只能在创建单元格后才能生效,且样式属性需要由工作薄生成。
单元格 ICell 有一个属性为CellStyle,通过给它赋值来操纵单元格的样式。
创建单元格样式,代码如下
// 创建样式
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center; // 水平对齐
style.VerticalAlignment = VerticalAlignment.Center; // 垂直对齐
style.BorderLeft = BorderStyle.Thin; // 左边框
将设置好的单元格样式赋值到单元格中,代码如下
cell.CellStyle = style; // 设置单元格的样式
完整示例代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
IRow row = sheet.CreateRow(0); // 创建第1行,参数为第几行
// 创建样式
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center; // 水平对齐
style.VerticalAlignment = VerticalAlignment.Center; // 垂直对齐
style.BorderLeft = BorderStyle.Thin; // 左边框
cell = row.CreateCell(0); // 创建第1行的第1个单元格,参数为第几列
cell.CellStyle = style; // 设置单元格的样式
字体只能应用于样式,且需要由工作薄生成。
创建字体,代码如下
// 创建字体
IFont font = workbook.CreateFont();
font.FontName = "微软雅黑";
将设置好的字体给到样式,代码如下
style.SetFont(font); // 设置字体
完整示例代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
IRow row = sheet.CreateRow(0); // 创建第1行,参数为第几行
// 创建字体
IFont font = workbooko_xlsx.CreateFont();
font.FontName = "微软雅黑";
// 创建样式
ICellStyle style = workbooko_xlsx.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center; // 水平对齐
style.VerticalAlignment = VerticalAlignment.Center; // 垂直对齐
style.BorderLeft = BorderStyle.Thin; // 左边框
style.SetFont(font); // 设置字体
cell = row.CreateCell(0); // 创建第1行的第1个单元格,参数为第几列
cell.CellStyle = style; // 设置单元格的样式
IFont 的部分属性如下
属性 | 类型 | 描述 | 可选值 |
---|---|---|---|
FontName | string | 字体类型 | 微软雅黑,宋体 |
FontHeightInPoints | double | 字号 | Excel表格中是多少字号此处就填什么,例:12 |
Color | short | 字体颜色 | HSSFColor.Red.Index |
IsBold | bool | 加粗 | true / false |
数据格式化需要从工作薄(Workbook)中创建
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1"); // 参数为工作表名称
IRow row = sheet.CreateRow(0); // 创建第1行,参数为第几行
// 创建数据格式化
IDataFormat dataFormat = workbook_xlsx.CreateDataFormat();
// 创建样式
ICellStyle style = workbooko_xlsx.CreateCellStyle();
style.DataFormat = dataFormat.GetFormat("#-###-###-##"); // 具体的自定义格式可查看Excel内容
cell = row.CreateCell(0); // 创建第1行的第1个单元格,参数为第几列
cell.CellStyle = style; // 设置单元格的样式
在导出的Excel中碰到了自定义格式不生效的问题,示例中的样式“#-###-###-##”需要生效的话需要将单元格设置为数字类型,字符串样式是不生效的。
导出文件流,示例代码如下
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
using Microsoft.AspNetCore.Mvc;
public IActionResult GetExcel()
{
IWorkbook workbook_xlsx = new XSSFWorkbook(); // 创建.xlsx工作薄
// 省略填充工作薄的流程
// ...
// 开始写入文件流
using MemoryStream ms = new();
workbook_xlsx.Write(ms, true);
byte[] bytes = ms.ToArray();
return new FileContentResult(bytes, "application/vnd.ms-excel")
{
FileDownloadName = "下载的文件名.xlsx"
};
}
前端接收文件流
这里以Vue3和axios为例
前端进行请求
import axios from "axios";
/**
* post方法,对应post请求
* @param {String} url 请求的url地址
* @param {Object} params 请求时携带的参数]
*/
function postGetFile (url, params) {
return new Promise((resolve, reject) => {
axios.post(url, params, {
"responseType": "blob",
}).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
})
});
}
function getFile () {
let url = "#"; // 这里存放对应的url
let params = {}; // 这里存放请求的参数
let res = await postGetFile(url, params);
// 模拟下载
let downloadA = document.createElement("a");
let blob = new Blob([ res.data ], { type: "application/vnd.ms-excel" });
downloadA.href = window.URL.createObjectUrl(blob);
downloadA.download = "你要下载的文件名.xlsx";
downloadA.click();
window.URL.revokeObjectURL(downloadA.href); // 清除缓存
}