导入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
业务逻辑代码:
List<T> list = new ArrayList<>();
List<T> list1 = new ArrayList<>();
//创建一个模板文件放在resources/file文件夹下
ClassPathResource resource = new ClassPathResource("file/统发工资单.xlsx");
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(resource.getInputStream()).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
// 如果数据量大 list不是最后一行 参照下一个
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
//把list集合里的数据填充到excel中
excelWriter.fill(new FillWrapper("list", list), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("list1", list1), fillConfig, writeSheet);
//填充excel数据,可填固定数据和运算得到的数据
Map<String, Object> map = new HashMap<String, Object>();
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String date = now.format(formatter);
map.put("month", "2023");
map.put("year", "8月份");
map.put("num", list.size() + list1.size);
map.put("date", date);
excelWriter.fill(map, writeSheet);
//HttpServletResponse response,前端传入
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
String fileName = URLEncoder.encode("xxxxx考核表", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
excelWriter.finish();
excel模板样例:
{ }中数据用于填充