首页 新闻 会员 周边

NPOI导出百万级数据问题

0
悬赏园豆:50 [已解决问题] 解决于 2021-10-20 12:00

用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();
        }
ll...ll的主页 ll...ll | 菜鸟二级 | 园豆:233
提问于:2021-10-20 11:10
< >
分享
最佳答案
0

方案一:简单粗暴,直接调大jvm使用内存
方案二:限制每次查询数量
方案三:可以试试阿里EasyExcel开源工具包进行poi数据导出,支持海量数据导出

收获园豆:45
绝不是木头 | 小虾三级 |园豆:507 | 2021-10-20 11:40

发现我这个写法也是可以的,我导出数据慢的原因是excel中有图片需要下载(图片需要到云下载),然后时间很慢

ll...ll | 园豆:233 (菜鸟二级) | 2021-10-20 11:52
其他回答(2)
0

需求有问题吧!
导出这么多数据的【价值、意义】 是什么?完全没必要吧?
要是给 另外的系统使用,包装成 流式数据 不是更好?
给人看的话,百万级数据 要看多久?一百年?

收获园豆:5
快乐的凡人721 | 园豆:3918 (老鸟四级) | 2021-10-20 11:17
0

傻啊,Excel压根就放不下100万以上的数据,我之前也试过导出这么多的数据,根本就不行

锦大大的博客呀! | 园豆:202 (菜鸟二级) | 2021-11-17 14:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册