项目引入easyexcel相关依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
controlelr层导出功能
@GetMapping("export")
public void exportExcel(HttpServletResponse response) throws IOException {
// 准备测试数据
List<DemoDataVO> list = new ArrayList<>();
list.add(new DemoDataVO("张三", "语文", "90"));
list.add(new DemoDataVO("张三", "数学", "80"));
list.add(new DemoDataVO("王五", "英语", "70"));
list.add(new DemoDataVO("王五", "政治", "85"));
list.add(new DemoDataVO("李四", "历史", "88"));
list.add(new DemoDataVO("马六", "历史", "77"));
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
String fileName = "demo export"+ ".xlsx";
fileName = new String(fileName.getBytes(), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName );
EasyExcel.write(response.getOutputStream(), DemoDataVO.class)
.registerWriteHandler(new MergeCellWriteHandler())
.autoCloseStream(Boolean.FALSE)
.sheet("demo")
.doWrite(list);
}
DemoDataVO类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DemoDataVO {
@ExcelProperty(value = "姓名", index = 0)
private String name;
@ExcelProperty(value = "学科", index = 1)
private String subject;
@ExcelProperty(value = "成绩", index = 2)
private String score;
}
MergeCellWriteHandler类
public class MergeCellWriteHandler implements CellWriteHandler {
private Map<Integer, String> lastContentMap = new HashMap<>();
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
CellWriteHandler.super.beforeCellCreate(writeSheetHolder, writeTableHolder, row, head, columnIndex, relativeRowIndex, isHead);
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
int columnIndex = cell.getColumnIndex();
String content = cellData.getStringValue();
if (lastContentMap.containsKey(columnIndex) && lastContentMap.get(columnIndex).equals(content)) {
mergeCells(writeSheetHolder, columnIndex, relativeRowIndex);
}
lastContentMap.put(columnIndex, content);
}
private void mergeCells(WriteSheetHolder writeSheetHolder, int columnIndex, Integer relativeRowIndex) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(relativeRowIndex, relativeRowIndex+1, columnIndex, columnIndex);
Sheet sheet = writeSheetHolder.getSheet();
sheet.addMergedRegion(cellRangeAddress);
}
}
导入功能和正常easyexcel的导入一样
@PostMapping("/import")
public void importCustomer(@RequestParam(value = "file") MultipartFile file) throws Exception {
InputStream inputStream = file.getInputStream();
List<DemoDataVO> list = EasyExcel.read(inputStream).head(DemoDataVO.class).sheet().doReadSync();
if (list == null || list.size() == 0) {
throw new RuntimeException("导入数据不能为空");
}
log.info("导入数据:{}", list);
}
导入数据:[DemoDataVO(name=张三, subject=语文, score=90), DemoDataVO(name=张三, subject=数学, score=80), DemoDataVO(name=王五, subject=英语, score=70), DemoDataVO(name=王五, subject=政治, score=85), DemoDataVO(name=李四, subject=历史, score=88), DemoDataVO(name=马六, subject=历史, score=77)]