java excel 导出慢的问题

shenchengwoshi 2016-12-06 11:55:40
现在要做一个excel下载的功能,下载之前要把excel的列编辑之后再下载,我直接BufferedOutputStream的write下载特别慢,求大神帮忙看看。怎么解决。。

HttpServletResponse response = ServletActionContext.getResponse();
BufferedInputStream in = null;
BufferedOutputStream out = null;
try {
String path = "E:/BDC/SrcModule/obis-web/src/excel/财务费用.xls";

String fileName = URLEncoder.encode("财务费用明细表.xls", "UTF-8");
File f = new File(path);
response.setHeader("Content-Disposition", "attachment; filename="
+ fileName);
response.setHeader("Content-Length", String.valueOf(f.length()));
in = new BufferedInputStream(new FileInputStream(f));

// 创建Excel工作薄
Workbook work = new HSSFWorkbook(in);
Sheet sheet = work.getSheet("财务费用");

for (int i = 0; i <= sheet.getLastRowNum(); i++) {
if (i == 0 || i == 2 || i == 3) {
continue;
} else if (i == 1 || i == 4 || i == 5 || i == 6 || i == 7
|| i == 8) {

if (i == 1) {
Row row = sheet.getRow((short) i);

String gsmc = (String) httpSession.getAttribute("gsmc");

Cell gsmcCell = row.getCell((short) 2);
gsmcCell.setCellValue("编制单位:" + gsmc);

Cell yuefenCell = row.getCell((short) 6);
yuefenCell.setCellValue(nf + "年" + yuefen + "月");
} else {
Row row = sheet.getRow((short) i);

Cell cell1 = row.getCell((short) 1);
Cell cell4 = row.getCell((short) 6);

cell1.setCellValue(listcaiwufeiyongInfoBean.get(i - 4)
.getSybqlj());
cell4.setCellValue(listcaiwufeiyongInfoBean.get(i - 4)
.getTqlj());
}
} else {
continue;
}
}

out = new BufferedOutputStream(response.getOutputStream());

work.write(out);

} catch (Exception e) {
logger.error("下载模版异常:", e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
logger.error("下载模版异常:", e);
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error("下载模版异常:", e);
}
}
}
...全文
536 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2016-12-06
  • 打赏
  • 举报
回复
输出的文件大小不对 response.setHeader("Content-Length", String.valueOf(f.length())); 你输出文件绝大部分情况和输入文件大小不一样,估计要比本地文件小,超过本地文件很快完成但是文件被截取了 导致你的客户端一直按输入文件大小接收,没结束就在等待。 你不设置文件大小 设置为chunked response.setHeader("Transfer-Encoding", "chunked");
shenchengwoshi 2016-12-06
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
输出的文件大小不对 response.setHeader("Content-Length", String.valueOf(f.length())); 你输出文件绝大部分情况和输入文件大小不一样,估计要比本地文件小,超过本地文件很快完成但是文件被截取了 导致你的客户端一直按输入文件大小接收,没结束就在等待。 你不设置文件大小 设置为chunked response.setHeader("Transfer-Encoding", "chunked");
好用了,谢谢大神

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧