Dernière activité 5 months ago

EasyExcel 使用模板导出 合并参考 https://juejin.cn/post/7322156759443095561

Révision 6f9ff02c3da8ccaca78d9249b8b385a6d6cc1165

MergeCellRangeWriteHandler.java Brut
1import com.alibaba.excel.write.handler.SheetWriteHandler;
2import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
3import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
4import org.apache.poi.ss.usermodel.Sheet;
5import org.apache.poi.ss.util.CellRangeAddress;
6
7import java.util.ArrayList;
8import java.util.List;
9
10/**
11 * 根据单元格区域合并单元格
12 **/
13public class MergeCellRangeWriteHandler implements SheetWriteHandler {
14
15 private final List<CellRangeAddress> rangeCellList;
16
17 public MergeCellRangeWriteHandler(List<CellRangeAddress> rangeCellList) {
18 this.rangeCellList = (rangeCellList == null) ? new ArrayList<>() : rangeCellList;
19 }
20
21 @Override
22 public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
23 }
24
25 @Override
26 public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
27 Sheet sheet = writeSheetHolder.getSheet();
28 for (CellRangeAddress cellRangeAddress : rangeCellList) {
29 sheet.addMergedRegionUnsafe(cellRangeAddress);
30 }
31 }
32}
33
PersonController.java Brut
1import com.alibaba.excel.EasyExcelFactory;
2import com.alibaba.excel.ExcelWriter;
3import com.alibaba.excel.write.metadata.WriteSheet;
4import com.alibaba.excel.write.metadata.fill.FillConfig;
5import org.apache.poi.ss.util.CellRangeAddress;
6
7import org.springframework.core.io.ClassPathResource;
8import org.springframework.http.HttpHeaders;
9import org.springframework.http.HttpStatus;
10import org.springframework.http.MediaType;
11import org.springframework.http.ResponseEntity;
12import org.springframework.web.bind.annotation.RequestMapping;
13import org.springframework.web.bind.annotation.RestController;
14
15
16import java.io.ByteArrayOutputStream;
17import java.io.InputStream;
18import java.net.URLEncoder;
19import java.util.*;
20import java.util.stream.Collectors;
21
22@RestController
23@RequestMapping("person")
24public class DemoController {
25
26 @GetMapping("export")
27 public ResponseEntity<Object> export() throws Exception {
28 List<Person> list = personService.queryList();
29 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
30 InputStream templateInputStream = new ClassPathResource("templates/PersonListTemplate.xlsx").getInputStream();
31
32 List<CellRangeAddress> cellRangeAddressList = buildMergeCellRangeList(list, 1, 4);
33 MergeCellRangeWriteHandler mergeStrategy = new MergeCellRangeWriteHandler(cellRangeAddressList);
34
35 ExcelWriter writer = EasyExcelFactory.write(outputStream).withTemplate(templateInputStream).build();
36 WriteSheet sheet = EasyExcelFactory.writerSheet().registerWriteHandler(mergeStrategy).sheetName("公司员工表").build();
37 Map<String, String> headerMap = new HashMap<>();
38 headerMap.put("companyName", "xxx 公司");
39 writer.fill(headerMap, sheet);
40
41 FillConfig fillConfig = FillConfig.builder()
42 .forceNewRow(true)
43 .build();
44 writer.fill(list, fillConfig, sheet);
45 writer.finish();
46
47 String encFileName = URLEncoder.encode("公司员工表", "UTF-8");
48 HttpHeaders headers = new HttpHeaders();
49 headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + encFileName + ".xlsx");
50 headers.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
51
52 return new ResponseEntity<>(outputStream.toByteArray(), headers, HttpStatus.OK);
53 }
54
55 private List<CellRangeAddress> buildMergeCellRangeList(
56 List<Person> statsList,
57 int columnIndex,
58 int startRowIndex
59 ) {
60 List<CellRangeAddress> rangeCellList = new ArrayList<>();
61 LinkedHashMap<String, Long> groupMap = statsList.stream()
62 .collect(Collectors.groupingBy(Person::getDepartmentName, LinkedHashMap::new, Collectors.counting()));
63 for (Map.Entry<String, Long> entry : groupMap.entrySet()) {
64 int count = entry.getValue().intValue();
65 if (count > 1) {
66 int endRowIndex = startRowIndex + count - 1;
67 rangeCellList.add(new CellRangeAddress(startRowIndex, endRowIndex, columnIndex, columnIndex));
68 }
69 startRowIndex += count;
70 }
71 return rangeCellList;
72 }
73}
74