欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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层获取下载地址。

SXSSFWorkbook导出大数据量Excel文件





方法是在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) {
		}
	}
}