Java導出Excel統計報表合並單元格的方法詳解

前言

Apache POI是一種流行的API,允許程序員使用Java程序創建,修改和顯示MS Office文件。 它是由Apache Software Foundation開發和分發的開源庫,用於使用Java程序設計或修改Microsoft Office文件。 它包含將用戶輸入數據或文件解碼為MS Office文檔的類和方法。

HSSF – 用於讀取和寫入MS-Excel文件的xls格式

示例

類似上面的需要合並表頭的報表在日常的開發中也是經常遇到,這裡總結下關於類似的報表開發整理。
對於這種的報表看起來很麻煩,但其實掌握瞭技巧開發起來也是很簡單的。下面的代碼僅供參考,有些字段為瞭脫敏都以數字顯示瞭,見諒。

 // 創建sheet
        Sheet sheet = wb.createSheet("當月");
        //表頭字體
        Font headerFont = wb.createFont();
        headerFont.setFontName("宋體");
        headerFont.setFontHeightInPoints((short) 18);
        headerFont.setBold(true);
        headerFont.setColor(Font.COLOR_NORMAL);
        //正文字體
        Font contextFont = wb.createFont();
        contextFont.setFontName("宋體");
        contextFont.setFontHeightInPoints((short) 12);
        headerFont.setBold(true);
        //表頭樣式,左右上下居中
        CellStyle headerStyle = wb.createCellStyle();
        headerStyle.setFont(headerFont);
        // 左右居中
        headerStyle.setAlignment(HorizontalAlignment.CENTER);
        // 上下居中
        headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        headerStyle.setLocked(true);
        // 自動換行
        headerStyle.setWrapText(false);
        //單元格樣式,左右上下居中 邊框
        CellStyle commonStyle = wb.createCellStyle();
        commonStyle.setFont(contextFont);
        // 左右居中
        commonStyle.setAlignment(HorizontalAlignment.CENTER);
        // 上下居中
        commonStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        commonStyle.setLocked(true);
        // 自動換行
        commonStyle.setWrapText(false);
        //單元格樣式,左右上下居中 邊框
        CellStyle commonWrapStyle = wb.createCellStyle();
        commonWrapStyle.setFont(contextFont);
        //單元格樣式,豎向 邊框
        CellStyle verticalStyle = wb.createCellStyle();
        verticalStyle.setFont(contextFont);
        CellStyle commonStyleNoBorder = wb.createCellStyle();
        commonStyleNoBorder.setFont(contextFont);
        commonStyleNoBorder.setLocked(true);
        // 自動換行
        commonStyleNoBorder.setWrapText(false);
        CellStyle alignLeftStyle = wb.createCellStyle();
        alignLeftStyle.setFont(contextFont);
        alignLeftStyle.setLocked(true);
        // 自動換行
        alignLeftStyle.setWrapText(false);
        //單元格樣式,左對齊 無邊框
        CellStyle alignLeftNoBorderStyle = wb.createCellStyle();
        alignLeftNoBorderStyle.setFont(contextFont);
        alignLeftNoBorderStyle.setLocked(true);
        // 自動換行
        alignLeftNoBorderStyle.setWrapText(false);
        //單元格樣式,右對齊
        CellStyle alignRightStyle = wb.createCellStyle();
        alignRightStyle.setFont(contextFont);
        alignRightStyle.setLocked(true);
        // 自動換行
        alignRightStyle.setWrapText(false);
        // 行號
        int rowNum = 0;
        //設置列寬
        for (int i = 0; i < 11; i++) {
            sheet.setColumnWidth(i, 3000);
        }

        //第一行
        Row r0 = sheet.createRow(rowNum++);
        r0.setHeight((short) 800);
        Cell c00 = r0.createCell(0);
        c00.setCellValue("表二:");
        c00.setCellStyle(alignLeftNoBorderStyle);
        //合並單元格
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
        //第二行城市對象綜合統計表
        Row r1= sheet.createRow(rowNum++);
        r1.setHeight((short) 800);
        Cell r10 = r1.createCell(0);
        r10.setCellValue("城市對象管理情況統計表");
        r10.setCellStyle(headerStyle);
        //合並單元格
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 8));
        //第三行
        Row r2 = sheet.createRow(rowNum++);
        r2.setHeight((short) 800);
        Cell r20 = r2.createCell(0);
        r20.setCellValue("填表單位:XXX街道");
        r20.setCellStyle(alignLeftNoBorderStyle);
        //合並單元格
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 4));
        //第四行
        Row r3 = sheet.createRow(rowNum++);
        r3.setHeight((short) 700);
        String[] rowSecond = {"地  區", "對象情況1", "","對象情況2","" ,"調增情況3","","情況4",""};

        for (int i = 0; i < rowSecond.length; i++) {
            Cell tempCell = r3.createCell(i);
            tempCell.setCellValue(rowSecond[i]);
            tempCell.setCellStyle(commonStyle);
        }
        //第5行
        Row r4 = sheet.createRow(rowNum++);
        String[] rowSecond5 = {"1", "2", "3","4","5","6","7","8"};
        for (int i = 0; i < rowSecond5.length; i++) {
            Cell tempCell = r4.createCell(i+1);
            tempCell.setCellValue(rowSecond5[i]);
            tempCell.setCellStyle(commonStyle);
        }
        //合並單元格
        sheet.addMergedRegion(new CellRangeAddress(3, 4, 0, 0));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 1, 2));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 3, 4));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 5, 6));
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 7, 8));
        //查詢數據
        List<Map<String, Object>> dataList = XXX.list(XXX);
        //統計合計數據
        Map<String,Object> mapTotal = new HashMap<>();
        for (Map<String, Object> map : dataList) {
            Row tempRow = sheet.createRow(rowNum++);
            //列表數據
            Cell tempCell0 = tempRow.createCell(0);
            String sqmc = (String) map.get("XXX");
            tempCell0.setCellValue(sqmc);
            tempCell0.setCellStyle(commonStyle);
        }
        //導出
  response.setContentType("application/vnd.ms-excel");
        // 文件名
        String fileName = "報表名稱.xls";
        response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");
        OutputStream stream = response.getOutputStream();
        try {
            if (null != wb && null != stream) {
                wb.write(stream);
                stream.close();
            }
        } catch (Exception e) {
            log.error("excel文檔導出錯誤-異常信息:", e);
        }  

註意事項

【1】POI操作的行和列都是從0位置開始的

【2】所有的復雜表頭無非是合並單元格,這裡都可以通過下面的API實現

int addMergedRegion(CellRangeAddress region)
添加合並的單元格區域

創建新的單元格范圍。索引是從零開始的。

參數:

firstRow—第一行的索引

lastRow—最後一行(含)的索引必須等於或大於第一行

firstCol—第一列的索引

lastCol—最後一列(包括)的索引必須等於或大於firstCol

示例

   sheet.addMergedRegion(new CellRangeAddress(3, 3, 1, 2));

合並第四行第1列和第2列

【3】對於空的單元格,直接在數組或者列表中給個空值就可以瞭。對於下面的圖片中第5行的[本月人次]這種如果是數組直接在創建列的時候指定起始位置為1就可以瞭,註意不要影響合並的位置,而且合並的單元格不要有沖突否則會拋出異常,註意些就可以瞭.

總結

到此這篇關於Java導出Excel統計報表合並單元格的文章就介紹到這瞭,更多相關Java導出Excel統計報表內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: