EasyExcel 一个模板填充多个sheet
📅 2023-08-03 15:15
👁️ 2002
💬 0
1.版本介绍
-
easyexcel:3.3.2
-
SpringBoot:2.7.1
-
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.导出结果
登录后才能查看或发表评论, 立即 登录