1.Visual Studio 环境中配置安装NPOI库
右击解决方案选择“管理解决方案的NuGet”程序包
在搜索框中搜索NPOI,如果搜索不到结果,需要点击“设置”,勾选“nuget.org”和“Microsoft and NET”选项
完成设置后,在进行搜索,如果还是没有搜索结果,需重复搜索几次,安装即可
- 引用相关命名空间
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.SS.Util;
2.HSSFWorkbook与XSSFWorkbook的区别和.xls和.xlsx的区别
xls和.xlsx的区别
1、.xls是2003版Office Microsoft Office Excel 工作表的格式,用03版Office,新建Excel默认保存的Excel文件格式的后缀是.xls;
2、.xlsx是2007版Office Microsoft Office Excel 工作表的格式,用07版Office,新建Excel默认保存的的Excel文件格式后缀是.xlsx。
3、07版的Office Excel,能打开编辑07版(后缀.xlsx)的Excel文件,也能打开编辑03版(后缀.xls)的Excel文件,都不会出现乱码或者卡死的情况。
4、03版的Office Excel,就只能打开编辑03版(后缀.xls)的Excel文件;如果打开编辑07版(后缀.xlsx)的Excel文件,则可能出现乱码或者开始能操作到最后出现卡死。
HSSFWorkbook与XSSFWorkbook的区别
1、NPOI使用HSSFWorkbook类来处理xls,XSSFWorkbook类来处理xlsx,它们都继承接口IWorkbook,因此可以通过IWorkbook来统一处理xls和xlsx格式的文件。
2、我们在到处EXCEL表格时使用HSSFWorkbook类来导出xls,XSSFWorkbook类来导出xlsx;如果用HSSFWorkbook类导出xlsx格式文件可以通过修改文件类型修改为xls,Office才可正常打开,Office打开后可以另存为xlsx格式文件,WPS可以正常打开导出的xlsx格式文件;如果用XSSFWorkbook类导出xls文件,Office可以打开。
注意:
使用NPOI.HSSF.UserModel空间下的HSSFWorkbook操作Excel2003
使用NPOI.XSSF.UserModel空间下的XSSFWorkbook操作Excel2007
3.导出Excel表格代码实践
写出表格方法 WriteExcel
public Task<byte[]> WriteExcel()
{
//创建内存流读写
using var fs = new MemoryStream();
//创建工作簿
IWorkbook workbook = new XSSFWorkbook();
//创建工作表
ISheet sheet1 = workbook.CreateSheet("统计");
var rowIndex = 0;
//合并单元格
sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, 5));
//创建行
IRow row = sheet1.CreateRow(rowIndex);
//创建单元格 第0列 值为:统计(总数:4)
row.CreateCell(0).SetCellValue("统计(总数:4)");
rowIndex++;
row = sheet1.CreateRow(rowIndex);
var str = new List<string> { "彭于晏", "我", "胡歌"};
for (int i = 0; i < 3; i++)
{
row.CreateCell(i).SetCellValue(str[i]);
}
rowIndex++;
for (int i = 0; i < 2; i++)
{
row = sheet1.CreateRow(rowIndex);
for (int j = 0; j < 3; j++)
{
row.CreateCell(j).SetCellValue("9999");
}
rowIndex++;
}
rowIndex++;
sheet1.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, 5));
row = sheet1.CreateRow(rowIndex);
row.CreateCell(0).SetCellValue("燕子(总数:3)");
rowIndex++;
row = sheet1.CreateRow(rowIndex);
for (int i = 0; i < 3; i++)
{
//宽度自适应
//sheet1.SetColumnWidth();
row.CreateCell(i).SetCellValue(str[i]);
}
rowIndex++;
for (int i = 0; i < 2; i++)
{
row = sheet1.CreateRow(rowIndex);
for (int j = 0; j < 3; j++)
{
row.CreateCell(j).SetCellValue("999");
}
rowIndex++;
}
workbook.Write(fs, true);
return Task.FromResult(fs.ToArray());
}
后端service
/// <summary>
/// 导出亚洲燕子统计
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("ExportSwallowStatisticToExcel")]
public async Task<ActionResult> ExportSwallowStatisticToExcelAsync(StatisticInput input)
{
ttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
var content = await _AppService.WriteExcel();
var fileName = "统计_" + input.StartDate + "_" + input.EndDate + ".xlsx";
return File(content, MimeTypes.GetByExtension(Path.GetExtension(fileName)), fileName);
}
前端导出按钮代码 前端使用的Angular
//导出
async export() {
const url =
sessionStorage.getItem(AppConsts.ApiUrl) + '/FileDo/ExportSwallowStatisticToExcel';
const headersParam: { [key: string]: string } = {};
headersParam['Authorization'] = 'Bearer ' + sessionStorage.getItem('access_token');
headersParam['accept-language'] = this.sessionStateService.getLanguage();
const les = this.getSwallowStatisticRequest();
const ret = await this.http
.post(url, les, { responseType: 'blob', headers: headersParam })
.toPromise();
const blob = new Blob([ret], { type: 'application/vnd.ms-excel' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
const date1 = this.datePipe.transform(this.startData, 'yyyyMMdd');
const date2 = this.datePipe.transform(this.endData, 'yyyyMMdd');
//excel文件名字
a.download = '统计_' + date1 + "_" + date2 + '.xlsx';
a.click();
}
getSwallowStatisticRequest(): StatisticInput {
const res = {} as StatisticInput;
//self
return res;
}