如何用Apache POI Workbook在同一工作表按公司分页打印Excel并重复表头
Apache POI实现同一工作表按公司分页+重复表头打印
要实现同一工作表内不同公司数据分页打印、每页重复表头的效果,直接通过设置打印重复行和插入分页符就能搞定,具体操作如下:
1. 设置打印时重复表头
用Sheet.setRepeatingRows()方法指定表头的行范围,注意POI里行索引从0开始,对应Excel界面的行号要加1。比如表头在Excel第1行,对应POI的行索引是0,代码示例:
// 创建工作表 XSSFSheet sheet = workbook.createSheet("公司数据"); // 设置打印时重复Excel第1行(即POI的0行)作为表头 sheet.setRepeatingRows(CellRangeAddress.valueOf("1:1"));
2. 按公司分组插入分页符
前提是你的数据已经按公司分组排序完成,每处理完一个公司的所有数据后,在该公司最后一行的下方插入分页符。比如A公司数据最后一行的POI索引是lastRowIndex,插入分页符的代码:
// 在lastRowIndex行之后插入分页符,下一页从此行的下一行开始 sheet.insertRowBreak(lastRowIndex);
完整示例代码片段
XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("公司数据"); // 写入表头行 Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("公司名称"); headerRow.createCell(1).setCellValue("员工姓名"); headerRow.createCell(2).setCellValue("部门"); // 设置打印重复表头 sheet.setRepeatingRows(CellRangeAddress.valueOf("1:1")); // 模拟按公司分组好的测试数据 List<List<String>> companyDataList = Arrays.asList( Arrays.asList("A公司", "张三", "技术部"), Arrays.asList("A公司", "李四", "财务部"), Arrays.asList("B公司", "王五", "人事部"), Arrays.asList("B公司", "赵六", "技术部"), Arrays.asList("C公司", "孙七", "财务部") ); int currentRow = 1; String currentCompany = null; for (List<String> rowData : companyDataList) { String companyName = rowData.get(0); Row dataRow = sheet.createRow(currentRow); dataRow.createCell(0).setCellValue(companyName); dataRow.createCell(1).setCellValue(rowData.get(1)); dataRow.createCell(2).setCellValue(rowData.get(2)); // 判断是否切换到新公司,是则给上一个公司的最后一行插入分页符 if (!companyName.equals(currentCompany)) { if (currentCompany != null) { sheet.insertRowBreak(currentRow - 1); } currentCompany = companyName; } currentRow++; } // 最后一个公司无需插入分页符,避免出现空白页 // 输出Excel文件 try (FileOutputStream fos = new FileOutputStream("公司数据.xlsx")) { workbook.write(fos); } catch (IOException e) { e.printStackTrace(); }
注意事项
- 必须确保数据已按公司名称分组排序,否则分页逻辑会混乱
- 分页符要插在每个公司数据的最后一行之后,不要碰表头行
- 如果使用
HSSFWorkbook(.xls格式),方法完全一致,仅类名不同
内容的提问来源于stack exchange,提问作者Daniel0909
相关产品推荐
相关产品推荐

