Apache Poi 4.1.0合併單元格後,RegionUtil設置邊框無效問題解決

背景

使用Apache Poi做Excel複雜表頭導出,涉及表格合併,合併後調用RegionUtil設置邊框效果無效。如下所示

解決

查了一波資料後都是採用RegionUtil。沒辦法,採用將每個單元格設置樣式,包括合併的每個單元格。

// 第二行表頭:涉及表頭合併
row = sheet.createRow(1);
// 增加此部分代碼,將合併的,沒有填值的也設置邊框樣式
int preColNum = 16;
for (int j = 0; j < preColNum; j++) {
    HSSFCell cell = row.createCell(j);
    cell.setCellStyle(style);
}
// 設置有值得單元樣式
for (int i = 0; i < excelHeader1.length; i++) {
    HSSFCell cell = row.createCell(i + preColNum);
    cell.setCellValue(excelHeader1[i]);
    cell.setCellStyle(style);
    sheet.autoSizeColumn(i + preColNum, true);// 自動調整寬度
}
// 動態合併單元格
for (int i = 0; i < headnum1.length; i++) {
    sheet.autoSizeColumn(i, true);
    String[] temp = headnum1[i].split(",");
    Integer startrow = Integer.parseInt(temp[0]);
    Integer overrow = Integer.parseInt(temp[1]);
    Integer startcol = Integer.parseInt(temp[2]);
    Integer overcol = Integer.parseInt(temp[3]);
    CellRangeAddress cra = new CellRangeAddress(startrow, overrow, startcol, overcol);
    sheet.addMergedRegion(cra);
    // 調用RegionUtil設置無效
    // this.setRegionBorder(BorderStyle.THIN, cra, sheet);
}

完整代碼

整理後,完整代碼如下:

public class RoomReserveExportUtil {
    private void setRegionBorder(BorderStyle border, CellRangeAddress region, Sheet sheet) {
        RegionUtil.setBorderBottom(border, region, sheet);
        RegionUtil.setBorderLeft(border, region, sheet);
        RegionUtil.setBorderRight(border, region, sheet);
        RegionUtil.setBorderTop(border, region, sheet);
    }

    /**
     * 動態合併單元格
     * @param headNum 表頭數字,“0,2,0,0”  ===>  “起始行,截止行,起始列,截止列”
     * @param sheet
     */
    private void mergeCell(String[] headNum, Sheet sheet) {
        // 動態合併單元格
        for (int i = 0; i < headNum.length; i++) {
            sheet.autoSizeColumn(i, true);
            String[] temp = headNum[i].split(",");
            Integer startrow = Integer.parseInt(temp[0]);
            Integer overrow = Integer.parseInt(temp[1]);
            Integer startcol = Integer.parseInt(temp[2]);
            Integer overcol = Integer.parseInt(temp[3]);

            CellRangeAddress cra = new CellRangeAddress(startrow, overrow, startcol, overcol);
            sheet.addMergedRegion(cra);
//            this.setRegionBorder(BorderStyle.THIN, cra, sheet);
        }
    }

    /**
     * 設置合併表格,空缺單元格樣式
     * @param row
     * @param startNum
     * @param endNum
     * @param style
     */
    private void setEmptyCellStyle(HSSFRow row, int startNum, int endNum, HSSFCellStyle style) {
        for (int j = startNum; j < endNum; j++) {
            HSSFCell cell = row.createCell(j);
            cell.setCellStyle(style);
        }
    }

    public HSSFWorkbook exportGoods(List<RoomReserveExtend> list) {
        //int titleRow = 6;//表頭標題及副標題佔6行
        //int tableBody = titleRow+1;//表頭開始
        // 聲明String數組,並初始化元素(表頭名稱)
        //第一行表頭字段,合併單元格時字段跨幾列就將該字段重複幾次
        String[] excelHeader0 = {
                "項目名稱",
                "招標編號",
                "招標單位",
                "項目類別",
                "項目區域",
                "開標時間",
                "評標時間",
                "審覈狀態",
                "招標方式",
                "招標組織形式",
                "招標代理機構",
                "出席開標人員姓名(代理機構)",
                "繳款單位(中標單位)",
                "中標金額(元)",
                "中標金額說明",
                "繳款通知書時間",
                "繳款金額(元)", "繳款金額(元)", "繳款金額(元)", "繳款金額(元)", "繳款金額(元)",
                "換票情況", "換票情況"

        };
        // “0,2,0,0”  ===>  “起始行,截止行,起始列,截止列”
        String[] headnum0 = {
                "0,2,0,0",
                "0,2,1,1",
                "0,2,2,2",
                "0,2,3,3",
                "0,2,4,4",
                "0,2,5,5",
                "0,2,6,6",
                "0,2,7,7",
                "0,2,8,8",
                "0,2,9,9",
                "0,2,10,10",
                "0,2,11,11",
                "0,2,12,12",
                "0,2,13,13",
                "0,2,14,14",
                "0,2,15,15",
                "0,0,16,20",
                "0,0,21,22"
        };
        // 第二行表頭字段,其中的空的雙引號是爲了補全表格邊框
        String[] excelHeader1 = {
                "合計5=(1+2)",
                "場地租賃費(1)",
                "服務費", "服務費", "服務費",
                "時間",
                "發票號碼"
        };
        // 合併單元格
        String[] headnum1 = {
                "1,2,16,16",
                "1,2,17,17",
                "1,1,18,20",
                "1,2,21,21",
                "1,2,22,22"
        };

        // 第三行表頭字段
        String[] excelHeader2 = {
                "新標準(2)",
                "舊標準(2)",
                "減負情況4=(3-2)"
        };

//        String[] headnum2 = {
//                "2,2,18,18",
//                "2,2,19,19",
//                "2,2,20,20"
//        };

        // 聲明一個工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        // 生成一個表格
        HSSFSheet sheet = wb.createSheet("項目導出結果");

        // 生成一種樣式style
        HSSFCellStyle style = wb.createCellStyle();
        // 設置樣式
        style.setFillForegroundColor(IndexedColors.SKY_BLUE.index);
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        // 生成一種字體
        HSSFFont font = wb.createFont();
        // 設置字體
        font.setFontName("微軟雅黑");
        // 設置字體大小
        font.setFontHeightInPoints((short) 12);
        // 在樣式中引用這種字體
        style.setFont(font);

//        // 生成標題樣式style1
//        HSSFCellStyle style1 = wb.createCellStyle();
//        // 設置樣式
//        style1.setAlignment(HorizontalAlignment.CENTER);
//        style1.setVerticalAlignment(VerticalAlignment.CENTER);
//
//        // 生成標題字體1
//        HSSFFont font1 = wb.createFont();
//        // 設置字體
//        font1.setFontName("微軟雅黑");
//        // 設置字體大小
//        font1.setFontHeightInPoints((short) 25);
//        // 字體加粗
//        font1.setBold(true);
//        // 在樣式中引用這種字體
//        style1.setFont(font1);

        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < excelHeader0.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(excelHeader0[i]);
            cell.setCellStyle(style);
            sheet.autoSizeColumn(i, true);// 根據字段長度自動調整列的寬度
        }
        // 動態合併單元格
        this.mergeCell(headnum0, sheet);

        // 第二行表頭
        row = sheet.createRow(1);
        int preColNum = 16;
        // 設置合併單元格,空缺單元格樣式
        this.setEmptyCellStyle(row, 0, preColNum, style);

        for (int i = 0; i < excelHeader1.length; i++) {
            HSSFCell cell = row.createCell(i + preColNum);
            cell.setCellValue(excelHeader1[i]);
            cell.setCellStyle(style);
            sheet.autoSizeColumn(i + preColNum, true);// 自動調整寬度
        }
        // 動態合併單元格
        this.mergeCell(headnum1, sheet);

        // 第三行表頭
        row = sheet.createRow(2);
        preColNum = 18;
        // 設置合併單元格,空缺單元格樣式
        this.setEmptyCellStyle(row, 0, preColNum, style);

        for (int i = 0; i < excelHeader2.length; i++) {
            HSSFCell cell = row.createCell(i + preColNum);
            cell.setCellValue(excelHeader2[i]);
            cell.setCellStyle(style);
            sheet.autoSizeColumn(i + preColNum, true);// 自動調整寬度
        }
        // 動態合併單元格
//        this.mergeCell(headnum2, sheet);

        // 設置合併單元格,空缺單元格樣式
        this.setEmptyCellStyle(row, 21, 23, style);

        for (int i = 0; i < list.size(); i++) {
            RoomReserveExtend vo = list.get(i);
            row = sheet.createRow(i + 3);

            HSSFCell cell0 = row.createCell(0);
            cell0.setCellValue(vo.getProjectName());

            HSSFCell cell1 = row.createCell(1);
            cell1.setCellValue(vo.getTenderCode());

            HSSFCell cell2 = row.createCell(2);
            cell2.setCellValue(vo.getTenderUnit());

            HSSFCell cell3 = row.createCell(3);
            cell3.setCellValue(vo.getProjectType());

            HSSFCell cell4 = row.createCell(4);
            cell4.setCellValue(vo.getArea());

            HSSFCell cell5 = row.createCell(5);
            cell5.setCellValue(vo.getApplyOpenTime());

            HSSFCell cell6 = row.createCell(6);
            cell6.setCellValue(vo.getEvalTime());

            HSSFCell cell7 = row.createCell(7);
            cell7.setCellValue(vo.getManageStatus());

            HSSFCell cell8 = row.createCell(8);
            cell8.setCellValue(vo.getTenderType());

            HSSFCell cell9 = row.createCell(9);
            cell9.setCellValue(vo.getTenderOrgType());

            HSSFCell cell10 = row.createCell(10);
            cell10.setCellValue(vo.getAgencyName());

            HSSFCell cell11 = row.createCell(11);
            cell11.setCellValue(vo.getOpenUsersShow());

            HSSFCell cell12 = row.createCell(12);
            cell12.setCellValue(vo.getAgencyName());

            HSSFCell cell13 = row.createCell(13);
            cell13.setCellValue(String.valueOf(vo.getTradePrice()));

            HSSFCell cell14 = row.createCell(14);
            cell14.setCellValue(vo.getTradePriceDesc());

            HSSFCell cell15 = row.createCell(15);
            cell15.setCellValue("");

            HSSFCell cell16 = row.createCell(16);
            cell16.setCellValue(vo.getAgencyName());

            HSSFCell cell17 = row.createCell(17);
            cell17.setCellValue(vo.getAgencyName());

            HSSFCell cell18 = row.createCell(18);
            cell18.setCellValue(vo.getAgencyName());

            HSSFCell cell19 = row.createCell(19);
            cell19.setCellValue(vo.getAgencyName());

            HSSFCell cell20 = row.createCell(20);
            cell20.setCellValue(vo.getAgencyName());

            HSSFCell cell21 = row.createCell(21);
            cell21.setCellValue(vo.getAgencyName());

            HSSFCell cell22 = row.createCell(22);
            cell22.setCellValue(vo.getAgencyName());
        }
        return wb;
    }
}

最終效果

轉載請註明:溜爸 » Apache Poi 4.1.0合併單元格後,RegionUtil設置邊框無效問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章