填充的模板
最后導出效果
實體
/*** 賬戶實體類* @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);}