固定模板方式,首先創建要Excel數據列模板;當然EasyExcel 中也可以動態自定義表頭,其實都差不多一樣
下面案例中,我采用一個固定模板方式,主要記錄下,如何自定義單元格樣式
這里是導出方法,主要是綁定樣式,指定Excel文件生成的路徑
public static String ExcelWrite(ExportParamDto excelData) { String fileName = getPath() + System.currentTimeMillis() + ".xlsx"; // 頭的策略 WriteCellStyle headWriteCellStyle = new WriteCellStyle(); // 背景色 headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); WriteFont headWriteFont = new WriteFont(); headWriteFont.setFontHeightInPoints((short) 12); headWriteCellStyle.setWriteFont(headWriteFont); // 內容的策略 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); // 這里需要指定 FillPatternType 為FillPatternType.SOLID_FOREGROUND 不然無法顯示背景顏色.頭默認了 FillPatternType所以可以不指定 // contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); // contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); // 背景綠色 // contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); // 字體策略 WriteFont contentWriteFont = new WriteFont(); // 字體大小 contentWriteFont.setFontHeightInPoints((short) 12); contentWriteCellStyle.setWriteFont(contentWriteFont); //設置 自動換行 contentWriteCellStyle.setWrapped(true); //設置 垂直居中 contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // //設置 水平居中 // contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // //設置邊框樣式 // contentWriteCellStyle.setBorderLeft(DASHED); // contentWriteCellStyle.setBorderTop(DASHED); // contentWriteCellStyle.setBorderRight(DASHED); // contentWriteCellStyle.setBorderBottom(DASHED); // 這個策略是 頭是頭的樣式 內容是內容的樣式 其他的策略可以自己實現 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); // 方法3 如果寫到不同的sheet 不同的對象 // 這里 指定文件 ExcelWriter excelWriter = EasyExcel.write(fileName).build(); // 去調用寫入,這里我調用了五次,實際使用時根據數據庫分頁的總的頁數來。這里最終會寫到5個sheet里面 WriteSheet writeSheet; List<SheetAndMapListDto> testList = excelData.getSheetAndMapListDtoList(); for (int i = 0; i < testList.size(); i++) { // 每次都要創建writeSheet 這里注意必須指定sheetNo。這里注意DemoData.class 可以每次都變,我這里為了方便 所以用的同一個class 實際上可以一直變 writeSheet = EasyExcel.writerSheet(i, testList.get(i).getRealSheetName()) .head(TestProTplDto.class) .registerWriteHandler(horizontalCellStyleStrategy) .registerWriteHandler(new CustomCellWriteHandler()) .build(); // 分頁去數據庫查詢數據 這里可以去數據庫查詢每一頁的數據 excelWriter.write((ArrayList) testList.get(i).getMapList(), writeSheet); } // finish 關閉流 excelWriter.finish(); return fileName; }
關於自定義綁定單元格樣式,查了很多,要么版本不匹配要么實現有問題,
轉來翻去,突然發現如圖這一段,這是官網給的Demo中生成Excel時綁定 表頭的樣式,官網也有提到可以 注冊監聽方法
想到這,思路一下就開闊起來了,那么我們是不是也可以寫一個 監聽方法,在監聽方法中,實現對單元格樣式的控制呢?
實現如下
我們自定義一個類實現 CellWriteHandler 接口
這里面有個坑,相比大家已經看到了 這個類中注釋掉的方法了,
看了官網 自定義攔截器。對第一行第一列的頭超鏈接到xxx
其中 案例中實現 beforeCellCreate,afterCellCreate 在代碼中報錯,,
接下來只能 看看CellWriteHandler 接口的參數,按照如下重新實現下
public class CustomCellWriteHandler implements CellWriteHandler { private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class); // @Override // public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, // Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { // // } // @Override // public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, // Head head, Integer relativeRowIndex, Boolean isHead) { // // } @Override public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, int columnIndex, boolean isHead) { } @Override public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, int relativeRowIndex, boolean isHead) { // 這里可以對cell進行任何操作 LOGGER.info("第{}行,第{}列寫入完成。", cell.getRowIndex(), cell.getColumnIndex()); // if (!isHead && cell.getStringCellValue().contains("個")) { if (!isHead && cell.getColumnIndex() == 1 && cell.getStringCellValue().contains("個")) { Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); CellStyle cellStyle = workbook.createCellStyle(); Font cellFont = workbook.createFont(); cellFont.setBold(true); cellStyle.setFont(cellFont); cell.setCellStyle(cellStyle); } }
自定義攔截器,實現對單元格樣式設置核心如下
用過 POI的應該都對 Workbook 這個不陌生了,其實 EasyExcel中也是集成了很多POI的接口的
本來想的是用 EasyExcel 中的 WriteFont contentWriteFont = new WriteFont();
但這塊里面卻沒有我想要的 對單元格字體加粗的實現方法,
最后突然轉念一想,攔截器方法中我們能拿到Workbook 難道還不能自定義單元格字體等格式嗎?顯然不是的
對比結合着之前POI使用經驗,很快想到我們可以這樣。
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
Font cellFont = workbook.createFont();
當然我這個是比較簡單的一個案例,只實現了某些特定列,(單元格內容 中包含 “個”單元格進行加粗)
其他的樣式及控制條件,大家可以自定義
接下來就是把 自定義樣式的攔截器在導出Excel這塊添加到 registerWriteHandler()中,這樣就可以實現自定義單元格樣式了