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!
推薦閱讀:
- C#利用NPOI操作Excel(單元格設置)
- SpringBoot實現excel文件生成和下載
- C#使用Npoi導出Excel並合並行列
- 解決poi導出時單元格樣式被覆蓋問題
- Java使用EasyExcel進行單元格合並的問題詳解