用NPOI导出百万级数据,导出报错,System.OutOfMemoryException
然后想到分段查询出数据,多个sheet导出,但还是导不出数据
代码如下:
//查询出数据
var exportData =getData();
byte[] export;
//2.使用NPOI构建Excel文件
var workbook = new XSSFWorkbook();
//数据大于5W分不同sheet导出
if (exportData.Count>50000)
{
decimal maxNum = 50000;
decimal sheetNum= Math.Ceiling(exportData.Count / maxNum);
int allNum = 0;
for (int i = 1; i <= sheetNum; i++)
{
var sheet = workbook.CreateSheet("Sheet"+i);
#region 构建表头
//定义CellStyle
var cellStyle = workbook.CreateCellStyle();
cellStyle.WrapText = false;
cellStyle.VerticalAlignment = VerticalAlignment.Center;
cellStyle.Alignment = HorizontalAlignment.Center;
//2.1构建表头
var headRow = sheet.CreateRow(0);
//定义HeadStyle
var headFont = workbook.CreateFont();
headFont.FontHeightInPoints = 10;
headFont.Boldweight = 700;
var headStyle = workbook.CreateCellStyle();
headStyle.WrapText = false;
headStyle.VerticalAlignment = VerticalAlignment.Center;
headStyle.Alignment = HorizontalAlignment.Center;
headStyle.SetFont(headFont);
headRow.CreateCell(0).SetCellValue("数据1");
headRow.GetCell(0).CellStyle = headStyle;
headRow.CreateCell(1).SetCellValue("数据2");
headRow.GetCell(1).CellStyle = headStyle;
headRow.CreateCell(2).SetCellValue("数据3");
headRow.GetCell(2).CellStyle = headStyle;
// 设置列宽度
sheet.SetColumnWidth(0, 15 * 256);
sheet.SetColumnWidth(1, 20 * 256);
sheet.SetColumnWidth(2, 50 * 256);
sheet.SetColumnWidth(3, 50 * 256);
sheet.DefaultRowHeight = 200;
#endregion
//2.2构建数据
var currentRowIndex = 1;
for (int j = 0; j < (exportData.Count/sheetNum); j++)
{
if (allNum > exportData.Count)
continue;
IRow newRow = sheet.CreateRow(currentRowIndex);
newRow.CreateCell(0).SetCellValue(exportData[allNum].dataNum);
//设置默认行高
newRow.HeightInPoints = 50;
newRow.CreateCell(1).SetCellValue(exportData[allNum].dataNum1);
newRow.CreateCell(2).SetCellValue(exportData[allNum].dataNum2);
currentRowIndex++;
allNum++;
}
}
}
using (var ms = new MemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
export = ms.ToArray();
}
方案一:简单粗暴,直接调大jvm使用内存
方案二:限制每次查询数量
方案三:可以试试阿里EasyExcel开源工具包进行poi数据导出,支持海量数据导出
发现我这个写法也是可以的,我导出数据慢的原因是excel中有图片需要下载(图片需要到云下载),然后时间很慢
需求有问题吧!
导出这么多数据的【价值、意义】 是什么?完全没必要吧?
要是给 另外的系统使用,包装成 流式数据 不是更好?
给人看的话,百万级数据 要看多久?一百年?
傻啊,Excel压根就放不下100万以上的数据,我之前也试过导出这么多的数据,根本就不行