固定模板方式,首先建立要Excel數據列模板;固然EasyExcel 中也能夠動態自定義表頭,其實都差很少同樣數據庫
下面案例中,我採用一個固定模板方式,主要記錄下,如何自定義單元格樣式app
這裏是導出方法,主要是綁定樣式,指定Excel文件生成的路徑ide
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時綁定 表頭的樣式,官網也有提到能夠 註冊監聽方法ui
想到這,思路一下就開闊起來了,那麼咱們是否是也能夠寫一個 監聽方法,在監聽方法中,實現對單元格樣式的控制呢?spa
實現以下excel
咱們自定義一個類實現 CellWriteHandler 接口code
這裏面有個坑,相比你們已經看到了 這個類中註釋掉的方法了,對象
看了官網 自定義攔截器。對第一行第一列的頭超連接到xxxblog
其中 案例中實現 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()中,這樣就能夠實現自定義單元格樣式了