阿里巴巴EasyExcel使用(2)-高亮和合並單元格


繼續上一篇的EasyExcel,本次任務是:①高亮顯示指定行的單元格的數據 ,②合並指定的單元格。

主要是紅色部分代碼~

一、自定義一個單元格樣式

public class CustomCellWriteHandler implements CellWriteHandler { 
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class);
    //標黃行寬集合
    private Set<Integer> yellowRowIndexs;

    //構造
    public CustomCellWriteHandler(Set<Integer> yellowRowIndexs) {
        this.yellowRowIndexs = yellowRowIndexs;
    }

    public CustomCellWriteHandler() {
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, 
Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { LOGGER.info(
"beforeCellCreate~~~~"); } @Override public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
Head head, Integer relativeRowIndex, Boolean isHead) { LOGGER.info(
"afterCellCreate~~~~"); } @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList,
Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 這里可以對cell進行任何操作 LOGGER.info("第{}行,第{}列寫入完成。", cell.getRowIndex(), cell.getColumnIndex()); if (CollectionUtils.isNotEmpty(yellowRowIndexs)) { Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); CellStyle cellStyle = workbook.createCellStyle(); //字體 Font cellFont = workbook.createFont(); cellFont.setBold(true); cellStyle.setFont(cellFont); //標黃,要一起設置 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //設置前景填充樣式 cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());//前景填充色 if (yellowRowIndexs.contains(cell.getRowIndex())) { cell.setCellStyle(cellStyle); } } } }

二、測試方法

 /**
     * 寫入到固定文件中,高亮顯示某一行
     *
     * @throws IOException
     */
    @Test
    public void writeToExcelFile3() {
        //這里自定義一個單元格的格式(標黃的行高亮顯示)
       Integer[] yellowRows = {3, 5, 7, 9}; Set<Integer> yellowRowsSet = new HashSet<>(Arrays.asList(yellowRows)); CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(yellowRowsSet); //寫入的文excel文件
        String fileName = "I:\\temp\\writeDemo3.xlsx";
        /*------------------------------分割線------------------------------*/
        //獲取頭和內容的策略
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy();

        //列寬的策略,寬度是小單位
        Integer columnWidthArr[] = {3000, 3000, 2000, 6000};
        List<Integer> columnWidths = Arrays.asList(columnWidthArr);
        CustomSheetWriteHandler customSheetWriteHandler = new CustomSheetWriteHandler(columnWidths);

        // 根據自定義導出的字段
        String[] filds = {"uid", "name", "age", "birthday"};

        String[] headers = {"唯一識別碼", "姓名", "年齡", "生日"};

        List head = getHeadByFilds(headers);

        //獲取模擬的實體數據集合
        List<User> userList = getUserList();

        //這里指定頭的名字去寫入,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉
        EasyExcel.write(fileName)
                .head(head)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .registerWriteHandler(customSheetWriteHandler)
                //注冊單元格式
 .registerWriteHandler(customCellWriteHandler)
                .includeColumnFiledNames(Arrays.asList(filds))
                .sheet("模板")
                .doWrite(userList);
    }

效果

 

 

 

三、自定義合並單元格的策略

/**
 * 自定義的合並策略,參考官方文檔的LoopMergeStrategy
 */
public class MyMergeStrategy extends AbstractMergeStrategy {
    //合並坐標集合
    private List<CellRangeAddress> cellRangeAddresss;

    //構造
    public MyMergeStrategy(List<CellRangeAddress> cellRangeAddresss) {
        this.cellRangeAddresss = cellRangeAddresss;
    }

    /**
     * merge
     *
     * @param sheet
     * @param cell
     * @param head
     * @param relativeRowIndex
     */
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        //合並單元格
        /**
         *  ****加個判斷:if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {}****
         * 保證每個cell被合並一次,如果不加上面的判斷,因為是一個cell一個cell操作的,
         * 例如合並A2:A3,當cell為A2時,合並A2,A3,但是當cell為A3時,又是合並A2,A3,
         * 但此時A2,A3已經是合並的單元格了
         */

        if (CollectionUtils.isNotEmpty(cellRangeAddresss)) {
            if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {
                for (CellRangeAddress item : cellRangeAddresss) {
                    sheet.addMergedRegionUnsafe(item);
                }
            }
        }
    }
}

這里要加個 if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {} 判斷條件,不然會報錯,網友已經說明,可以驗證一下~

 

四、測試合並

  /**
     * 模擬合並單元格的位置
     *
     * @return
     */
    private List<CellRangeAddress> getCellRangeAddresss() {
        List<CellRangeAddress> list = new ArrayList<>();
        //合並第4行
        CellRangeAddress item1 = new CellRangeAddress(3, 3, 0, 3);
        //合並第第6行的第一列和第二列
        CellRangeAddress item2 = new CellRangeAddress(5, 5, 0, 1);
        //合並第9行和第10行
        CellRangeAddress item3 = new CellRangeAddress(10, 11, 0, 3);

        list.add(item1);
        list.add(item2);
        list.add(item3);
        return list;

    }
  

/** * 寫入到固定文件中,合並單元格 * * @throws IOException */ @Test public void writeToExcelFile4() { //定義合並單元格的坐標范圍 List<CellRangeAddress> cellRangeAddresss = getCellRangeAddresss(); //定義合並單元格策略 MyMergeStrategy myMergeStrategy = new MyMergeStrategy(cellRangeAddresss); //寫入的文excel文件 String fileName = "I:\\temp\\writeDemo4.xlsx"; /*------------------------------分割線------------------------------*/ //這里自定義一個單元格的格式(標黃的行高亮顯示) Integer[] yellowRows = {3, 5, 7, 9}; Set<Integer> yellowRowsSet = new HashSet<>(Arrays.asList(yellowRows)); CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(yellowRowsSet); //獲取頭和內容的策略 HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy(); //列寬的策略,寬度是小單位 Integer columnWidthArr[] = {3000, 3000, 2000, 6000}; List<Integer> columnWidths = Arrays.asList(columnWidthArr); CustomSheetWriteHandler customSheetWriteHandler = new CustomSheetWriteHandler(columnWidths); // 根據自定義導出的字段 String[] filds = {"uid", "name", "age", "birthday"}; String[] headers = {"唯一識別碼", "姓名", "年齡", "生日"}; List head = getHeadByFilds(headers); //獲取模擬的實體數據集合 List<User> userList = getUserList(); //這里指定頭的名字去寫入,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉 EasyExcel.write(fileName) .head(head) .registerWriteHandler(horizontalCellStyleStrategy) .registerWriteHandler(customSheetWriteHandler) //注冊單元格式 .registerWriteHandler(customCellWriteHandler) //注冊合並策略 .registerWriteHandler(myMergeStrategy) .includeColumnFiledNames(Arrays.asList(filds)) .sheet("模板") .doWrite(userList); }

 

效果 (ps:加粗的合並區域邊框是手動加上去看效果的)

 

五、總結

今天財務系統發布,產品和測試正在發版~正好有點空余時間好好利用~

 


免責聲明!

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



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