前言
需求是这样的,需要在页面导出列表表格时同时导出每项的详情数据,而且详情表格并不是一个常规的二维表格,就像图中这样的效果,所以要解决的最主要两个问题就是:多sheet实现、异形表格模板填充。


教程
1.引入EasyExcel,为了减少代码量,不重复造轮子
1 2 3 4 5
| <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.0</version> </dependency>
|
2.写填充模板
- 我导出的表格需要有个汇总表,填充的是集合需要在变量前加点,像这样 {.变量名}

- 这是详情表,模板可以根据你想要的来,填充非对象集合就不需要加点,这里要记住你需要生成多sheet的模板索引,这里位置在第二个,索引就是1,后面编码过程会用到

3.编码
3.1 生成多sheet名-数据对象键值对
- 根据你的业务需求,我们可以提前把模板生成好,再去填充数据,excel中不能出现重复的sheet名,我们要把重命名的sheet名和数据对应上,我们可以创建一个HashMap去存放sheet名和数据对,这是我的代码:
1 2 3 4 5 6 7 8 9 10
| List<Student> list = taskList(new Student(idList));
Map<String, Student> sheetMap = new HashMap<>(); for (Student student : list) { String sheetName = student.getName() + "--表格"; putIfContainsKey(sheetMap, sheetName, student); }
|
- 我这里的sheet名是有可能会重复的,所以这里的put自己写了递归去重命名,putIfContainsKey方法如下,遇到重复的sheet直接递归在sheet名后加(1)
1 2 3 4 5 6 7
| public static void putIfContainsKey(Map sheetMap, String sheetName, Object data) { if(sheetMap.containsKey(sheetName)){ putIfContainsKey(sheetMap, sheetName + "(1)", data); }else { sheetMap.put(sheetName, data); } }
|
3.2 生成多sheet模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| InputStream inStream = new FileInputStream("D:\template.xlsx");
int cloneIndex = 1;
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
ByteArrayOutputStream bos = new ByteArrayOutputStream(); for (Map.Entry<String, Student> entry : sheetMap.entrySet()) { workbook.cloneSheet(cloneIndex, entry.getKey()); }
workbook.removeSheetAt(cloneIndex);
workbook.write(bos);
|
3.3 通过EasyExcel导出表格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| String filename = "D:\out.xlsx";
ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
ExcelWriter excelWriter = EasyExcel.write(filename).withTemplate(is).build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
WriteSheet writeSheet = EasyExcel.writerSheet("汇总").build(); excelWriter.fill(list, fillConfig, writeSheet);
for (Map.Entry<String, Student> entry : sheetMap.entrySet()) { WriteSheet writeSheet = EasyExcel.writerSheet(entry.getKey()).build(); excelWriter.fill(entry.getValue(), fillConfig, writeSheet); List<StudentDetail> detailList = entry.getValue().getDetailList(); excelWriter.fill(list, fillConfig, writeSheet); }
excelWriter.finish();
|