SXSSFWorkbook导出大数据量Excel文件

来源:互联网 发布:空气净化器有用吗 知乎 编辑:程序博客网 时间:2024/05/19 19:55

最近在导出大数据量进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) {}}}


原创粉丝点击