SXSSFWorkbook导出大数据量Excel文件
程序员文章站
2022-07-13 13:16:31
...
最近在导出大数据量进excel文件时,之前用的XSSFWorkbook在写文件的时候,项目一直报内存溢出。在查询POI后发现新出的SXSSFWorkbook正是为处理大数据量而生,在苦苦找了两天SXSSFWorkbook导出带模板的excel未果后,决定采用excel表头自己打印的方法来形成表头字段。
String[] assetHeadTemp = {"批次","供应商代码","商品名称"};//表头名
String[] assetNameTemp = {"charg","zgysdm","zspmc"};//表头字段
Workbook wb = new SXSSFWorkbook(100);// 内存中保留 1000 条数据,以免内存溢出,其余写入 硬盘
Sheet sheet = wb.createSheet("Sheet1");
Row row;
Cell cell;
// 输出表头
row = sheet.createRow(0);
for (int i = 0; i < assetHeadTemp.length; i++) {
cell = row.createCell(i);
cell.setCellValue(assetHeadTemp[i]);
}
int rowIndex = 1;
// 输出表内数据
for (Map<String, Object> map : dataList) {
row = sheet.createRow(rowIndex++);
int index = 0;
for (int i = 0; i < assetNameTemp.length; i++) {
cell = row.createCell(index++);
cell.setCellValue(map.get(assetNameTemp[i]) != null ? map.get(assetNameTemp[i]).toString() : "");
}
}
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");//文件保存地址
wb.write(out);// 导出excel文件
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
if (wb != null) {
wb.close();
}
上述方法适合测试下载文件到本地的绝对路径,如果部署到服务器上,想要点击下载后在页面就能显示如图提示框,则需要在controller层获取下载地址。
方法是在service层将数据导成excel文件,然后用SFTP将文件上传到服务器端(上传、下载方法自行百度),最后在controller层从服务器下载该文件。
response.setContentType("multipart/form-data");
String fileName = "报表";
OutputStream out = null;
try {
response.addHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"iso8859-1")+".xlsx");
// 用response得到的下载地址,会下载到电脑的“下载”文件夹并提示
out = new BufferedOutputStream(response.getOutputStream());
// 用SFTP下载上传的excel文件,代码省略
out.flush();
} catch (Exception e) {
e.printStackTrace();
logger.error("导出失败");
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
上一篇: 进制转换