Springboot 项目使用 POI 生成并导出 Excel

424 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

在做一个 SpringBoot 前后端分离项目的时候,需要将数据存到 Excel中,用户点击可以下载 Excel。实现是采用 Apache 提供的 POI操作 Excel。源码在文章的最后会例出。

8df0d35a91984785ab319909266df5b9

POI API 文档: poi.apache.org/apidocs/dev…

步骤

  1. 导入 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>
    
  2. 使用 produces 设置响应类型和编码为 "application/octet-stream"。

    @RequestMapping(value = "/down", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    
  3. 通过使用 SXSSFWorkbook 设置 Excel 表,包括设置表的名称,表格的宽度,表格中的值

    SXSSFWorkbook workbook = new SXSSFWorkbook();
    
    //设置表格名称
    SXSSFSheet sheet = workbook.createSheet("销售榜单");
    //设置表格默认宽度30
    sheet.setDefaultColumnWidth(30);
    
    //设置 sheet 表格的第0行
    SXSSFRow row = sheet.createRow(0);
    //设置 sheet 表格的第0行第0列的值
    row.createCell(0).setCellValue("商品名称");
    //设置 sheet 表格的第0行第1列的值
    row.createCell(1).setCellValue("数量");
    
  4. 设置响应头

    //设置响应头
    response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
    //filename 为 Excel 文件名称
    
  5. 获取 response 的输出流,通过输出流将 Excel 输出。

    //将 Excel 表输出到输出流
    OutputStream out = response.getOutputStream();
    workbook.write(out);
    

样例代码

//1、通过 SXSSFWorkbook 设置 Excel 表
//2、设置响应头
//3、输出流输出
@RequestMapping(value = "/down", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void downXlsx(HttpServletResponse response) {

    //设置表名
    String fileName = "销售榜单.xlsx";

    SXSSFWorkbook workbook = new SXSSFWorkbook();

    //设置表格名称
    SXSSFSheet sheet = workbook.createSheet("销售榜单");
    //设置表格默认宽度30
    sheet.setDefaultColumnWidth(30);

    //设置 sheet 表格的第0行
    SXSSFRow row = sheet.createRow(0);
    //设置 sheet 表格的第0行第0列的值
    row.createCell(0).setCellValue("商品名称");
    //设置 sheet 表格的第0行第1列的值
    row.createCell(1).setCellValue("数量");

    OutputStream out = 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 (Exception e) {
        e.printStackTrace();
    } finally {
        workbook.dispose();
        try {
            if (out != null)
                out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}