不解的poi导出。。求教
@红薯 我在用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
其实是看业务,客户是否需要看即时数据,一般周报表,月报表,可以晚上产生好,用户来了就下载打开,如果是即时数据,就只能让客户等了。
谢谢
3.9后有流方式写的
否则每个cell都是一个对象,占很多内存
回复
>3.9 done
恩 我用的3.6
回复
喔 如果把controller弄的时间长了也可以,其实也没什么意义了。客户也不能等待很长的时间。数据量一直增加,我也不能一直调整controller时间吧。
回复
一般这种可以考虑后台处理,不需要给用户实时输出数据
@红薯
@红薯 喔 我现在在做一个后台管理系统,有一个业务就是需要到处这些数据。不知道有没有一个好点的解决这个问题的方法呢?
回复
技术上没什么好解决的,毕竟文件就那么大。可以从业务上去调整,例如后台处理,处理完再通知用户下载
@红薯 恩 好的。写一个线程处理?
处理大的表格时间肯定要更长,如果这个时间超出你 Controller 的时间,那么 timeout 不就很正常了吗?