EasyExcel使用及自定義設置單元格樣式


 

固定模板方式,首先創建要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()中,這樣就可以實現自定義單元格樣式了

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM