easyexcel填充方式导出-合并单元格并设置边框
填充的模板
最后导出效果
实体
/*** 账户实体类* @author test* @date 2025-07-28*/
@Getter
@Setter
class Test {/*** 账户类型*/private String accType;/*** 账户余额*/private String money;
}
导出逻辑
/*** 导出文件逻辑*/
public void exportReport(List<Test> data) { try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {final ExcelWriter excelWriter = EasyExcel.write(byteArrayOutputStream).withTemplate(ResourceUtil.getStream("/test/report.xlsx")).registerWriteHandler(buildCellWrite(data.size())).build();WriteSheet writeSheet = EasyExcel.writerSheet(0).build();// 将内容竖向填充FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).forceNewRow(false).build();excelWriter.fill(data, fillConfig, writeSheet);excelWriter.finish();// ... 根据流导出文件} catch (IOException e) {log.error("导出结存报表异常", e);}
} /*** 处理单元格样式** @return CellWriteHandler* @author test* @date 2025-7-27 14:48:35*/private CellWriteHandler buildCellWrite(Integer column) {return new CellWriteHandler() {@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> cellDataList, Cell cell,Head head, Integer relativeRowIndex, Boolean isHead) {//当前行int curRowIndex = cell.getRowIndex();//当前列int curColIndex = cell.getColumnIndex();Workbook workbook = writeSheetHolder.getParentWriteWorkbookHolder().getWorkbook();// 合并第一行的内容if (curRowIndex == 0 && curColIndex == 0) {Sheet sheet;// 这里需要将格式SXSSWorkbook转为XSSFWorkbook否则获取到的row会为空if (workbook instanceof SXSSFWorkbook) {SXSSFWorkbook sxssfWorkbook = (SXSSFWorkbook) workbook;sheet = sxssfWorkbook.getXSSFWorkbook().getSheetAt(0);} else {sheet = workbook.getSheetAt(0);}writeSheetHolder.setSheetNo(0);CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, column);sheet.addMergedRegion(cellRangeAddress);final Row row = sheet.getRow(0);// 合并后手动设置一下几个格子的边框for (int i = 0; i <= column; i++) {Cell cellInfo = row.getCell(i);if (cellInfo == null) {cellInfo = row.createCell(i);}updateCellStyle(workbook, cellInfo, true);}} else {updateCellStyle(workbook, cell, false);}}};}/*** 设置某个格子的样式** @param workbook 工作簿* @param cell 格子*/private static void updateCellStyle(Workbook workbook, Cell cell, Boolean isHead) {CellStyle newCellStyle = workbook.createCellStyle();CellStyle cellStyle = cell.getCellStyle();BeanUtil.copyProperties(cellStyle, newCellStyle);Font font = workbook.createFont();if (isHead) {// 添加默认样式font.setColor(IndexedColors.BLACK.getIndex());newCellStyle.setWrapText(true);font.setBold(Boolean.TRUE);newCellStyle.setFont(font);}String fontName = "宋体";font.setFontName(fontName);newCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());newCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());newCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());newCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());newCellStyle.setBorderBottom(BorderStyle.THIN);newCellStyle.setBorderTop(BorderStyle.THIN);newCellStyle.setBorderLeft(BorderStyle.THIN);newCellStyle.setBorderRight(BorderStyle.THIN);// 单元格垂直对齐newCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);newCellStyle.setAlignment(HorizontalAlignment.LEFT);cell.setCellStyle(newCellStyle);}