不解的poi导出。。求教

发布于 2021-11-23 15:31:39 字数 3864 浏览 735 评论 11

@红薯 我在用poi 导出excel文档,2000以下数据没什么问题,可是数据量大时,就没有反应了。直到Controller 请求时间,时间一过,就time out 了。

主要核心导出代码(如下): 

private Collection reports = new ArrayList();

reports 的大小 在3000左右  就导不出来了。几百的话 还行, 谁能支个招?

Iterator iterator = reports.iterator();
int count = 1;
while (iterator.hasNext()) {
    int cel = 0;
    FinanceOrder report = (FinanceOrder) iterator.next();
    row = sheet.createRow(count++); // 根据数据的记录条数来对相应的行填充数据
    cell = row.createCell(cel++);
    cell.setCellValue(report.getOrdernum());

    cell = row.createCell(cel++);
    cell.setCellValue(report.getRetordernum());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getAliascode());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getOrderstate());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getOwnerid());
    cell = row.createCell(cel++);
    if (report.getCreatedatetime() != null) {
        cell.setCellValue(report.getCreatedatetime().toString());
    } else {
        cell.setCellValue("");
    }
    cell = row.createCell(cel++);
    if (report.getInMoneyDate() != null) {
        cell.setCellValue(report.getInMoneyDate().toString());
    } else {
        cell.setCellValue("");
    }
    cell = row.createCell(cel++);
    cell.setCellValue(report.getOrderAmount());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getPayedAmont());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getUnpayAmount());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getCash());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getPosfamilycard());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getPosicbccard());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getAlipay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getTenpay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getUpoppay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getEbankpay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getIcpcpay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getBanktelegraphic());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getIntegralpay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getGiftcardpay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getCardpay());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getCardbatch());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getCardname());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getCoupon());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getDiscard());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getNetgive());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getTotalbeforediscountmoney());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getTotalafterdiscountmoney());
    cell = row.createCell(cel++);
    if (report.getWarehouseoutdate() != null) {
        cell.setCellValue(report.getWarehouseoutdate().toString());
    } else {
        cell.setCellValue("");
    }
    cell = row.createCell(cel++);
    cell.setCellValue(report.getStationcode());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getStationname());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getGuestfreight());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getWeight());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getOrdertype());
    cell = row.createCell(cel++);
    cell.setCellValue(report.getFreshflag());
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

筱武穆 2021-11-26 13:02:04

其实是看业务,客户是否需要看即时数据,一般周报表,月报表,可以晚上产生好,用户来了就下载打开,如果是即时数据,就只能让客户等了。

尐偏执 2021-11-26 13:02:04

谢谢

风透绣罗衣 2021-11-26 13:02:04

3.9后有流方式写的

否则每个cell都是一个对象,占很多内存

倾城泪 2021-11-26 13:02:04

回复
>3.9 done

贱贱哒 2021-11-26 13:02:04

恩 我用的3.6

狠疯拽 2021-11-26 13:02:03

回复
喔 如果把controller弄的时间长了也可以,其实也没什么意义了。客户也不能等待很长的时间。数据量一直增加,我也不能一直调整controller时间吧。

北笙凉宸 2021-11-26 13:01:57

回复
一般这种可以考虑后台处理,不需要给用户实时输出数据

绝情姑娘 2021-11-26 12:29:40

@红薯
@红薯 喔 我现在在做一个后台管理系统,有一个业务就是需要到处这些数据。不知道有没有一个好点的解决这个问题的方法呢?

疑心病 2021-11-26 10:23:19

回复
技术上没什么好解决的,毕竟文件就那么大。可以从业务上去调整,例如后台处理,处理完再通知用户下载

反话 2021-11-26 01:17:04

@红薯 恩 好的。写一个线程处理?

妖妓 2021-11-25 04:31:01

处理大的表格时间肯定要更长,如果这个时间超出你 Controller 的时间,那么 timeout 不就很正常了吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文