EasyExcel 一个模板填充多个sheet

发布时间 2023-08-03 15:22:51作者: 流光幻影

1.版本介绍

  1. easyexcel:3.3.2

  2. SpringBoot:2.7.1

  3. Apache POI:4.1.2

2.背景介绍

现提供一个excel模板(sheet1),导出列表记录时,每个sheet页展示一条记录,最终生成多sheet文件

3.实现代码

注意:代码伪代码

@Slf4j
public class POIUtil {


    /**
    *获取resource下模板文件的文件流
    *
    */
    public static InputStream getResourcesFileInputStream(String fileName) {
        return Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
    }
    
    /**
     * 通过模板 生成多sheet
     *
     * @param inputStream
     * @return
     */
    @SneakyThrows
    public static InputStream createSheetFromTemplate(InputStream inputStream, int size) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //原模板只有一个sheet,通过poi复制出需要的sheet个数的模板
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        //设置模板的第一个sheet的名称
        workbook.setSheetName(0, "sheet1");
        for (int i = 1; i < size; i++) {
            //复制模板,得到第i个sheet
            int num = i + 1;
            workbook.cloneSheet(0, "sheet" + num);
        }
        //写到流里
        workbook.write(bos);
        byte[] bArray = bos.toByteArray();
        InputStream is = new ByteArrayInputStream(bArray);
        return is;
    }

}


public class Application {

     public void listExport(HttpServletResponse response) {
         // 获取导出数据
        List<MyData> myDataList = service.getData();

        InputStream inputStream = POIUtil.getResourcesFileInputStream("template.xlsx");
        // 由模板生成多sheet
        InputStream is = POIUtil.createSheetFromTemplate(inputStream, myDataList.size());
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(is).build();
        for (int i = 0; i < myDataList.size(); i++) {
             int num = i + 1;
             MyData data = myDataList.get(i);
             WriteSheet writeSheet = EasyExcel.writerSheet("sheet" + num).build();
             excelWriter.fill(data, writeSheet);
         }
         excelWriter.finish()
     }
    
    
}

4.导出结果

image-20230803151409247