在做一个 SpringBoot 前后端分离项目的时候,需要将数据存到 Excel中,用户可以下载 Excel。具体实现是采用 Apache 强大的 POI。文章最后将源码例出。
POI API 文档: https://poi.apache.org/apidocs/dev/index.html
步骤
- 导入 POI 的 maven 依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.1.0</version></dependency>
- 使用 produces 设置响应类型和编码为 “application/octet-stream”。
value="/down", produces=MediaType.APPLICATION_OCTET_STREAM_VALUE) (
- 通过使用 SXSSFWorkbook 设置 Excel 表
SXSSFWorkbookworkbook=newSXSSFWorkbook(); //设置表格名称SXSSFSheetsheet=workbook.createSheet("销售榜单"); //设置表格默认宽度30sheet.setDefaultColumnWidth(30); //设置 sheet 表格的第0行SXSSFRowrow=sheet.createRow(0); //设置 sheet 表格的第0行第0列的值row.createCell(0).setCellValue("商品名称"); //设置 sheet 表格的第0行第1列的值row.createCell(1).setCellValue("数量");
- 设置响应头
//设置响应头response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); //filename 为 Excel 文件名称
- 获取 response 的输出流,通过输出流将 Excel 输出。
//将 Excel 表输出到输出流OutputStreamout=response.getOutputStream(); workbook.write(out);
样例代码
//1、通过 SXSSFWorkbook 设置 Excel 表//2、设置响应头//3、输出流输出value="/down", produces=MediaType.APPLICATION_OCTET_STREAM_VALUE) (publicvoiddownXlsx(HttpServletResponseresponse) { //设置表名StringfileName="销售榜单.xlsx"; SXSSFWorkbookworkbook=newSXSSFWorkbook(); //设置表格名称SXSSFSheetsheet=workbook.createSheet("销售榜单"); //设置表格默认宽度30sheet.setDefaultColumnWidth(30); //设置 sheet 表格的第0行SXSSFRowrow=sheet.createRow(0); //设置 sheet 表格的第0行第0列的值row.createCell(0).setCellValue("商品名称"); //设置 sheet 表格的第0行第1列的值row.createCell(1).setCellValue("数量"); OutputStreamout=null; try { //设置响应头response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); //将 Excel 表输出到输出流out=response.getOutputStream(); workbook.write(out); out.flush(); } catch (Exceptione) { e.printStackTrace(); } finally { workbook.dispose(); try { if (out!=null) out.close(); } catch (IOExceptione) { e.printStackTrace(); } } }