Java 如何将数据库记录导入iText生成的PDF表格报表
iText实现数据库ResultSet数据生成规整PDF报表的改造方案
核心改造逻辑
不需要推翻你现有的查询逻辑,只需要把遍历ResultSet时直接输出Paragraph的部分,替换为按表格结构逐行写入内容即可,完全兼容全量查询、按un筛选两种场景,同时保留匹配用户名前加*的标识规则。
具体实现步骤
- 初始化双列PDF表格对象:设置列数为2对应username、role字段,可根据内容长度调整列宽占比
- 优先写入表头:单独添加一行作为表头,分别填充"username"、"role"文本,可通过加粗字体做视觉区分
- 遍历原有ResultSet:
- 正常读取当前行的username、role字段值
- 对比当前username和传入的筛选参数un,匹配则在用户名前拼接*标识
- 将处理后的两个字段值作为单元格内容,按顺序添加到表格对象中,自动生成对应记录行
- 所有记录遍历完成后,将整个表格对象直接添加到PDF文档中,替换原有的零散Paragraph输出
核心代码参考
// 初始化两列表格,占满页面宽度 PdfPTable userReportTable = new PdfPTable(2); userReportTable.setWidthPercentage(100); // 设置列宽,给用户名列分配更多空间 userReportTable.setWidths(new float[]{2.2f, 1f}); // 写入表头 Font headerFont = new Font(FontFactory.getFont(FontFactory.HELVETICA, 12, Font.BOLD)); userReportTable.addCell(new PdfPCell(new Phrase("username", headerFont))); userReportTable.addCell(new PdfPCell(new Phrase("role", headerFont))); // 沿用原有SQL查询逻辑,支持全量/按un筛选两种模式 ResultSet rs = userStatement.executeQuery(原有查询SQL); while (rs.next()) { String userName = rs.getString("username"); String userRole = rs.getString("role"); // 匹配筛选值时加*标识 if (un != null && un.equals(userName)) { userName = "*" + userName; } // 逐行写入表格 userReportTable.addCell(new PdfPCell(new Phrase(userName))); userReportTable.addCell(new PdfPCell(new Phrase(userRole))); } // 将完整表格写入PDF文档 document.add(userReportTable);
适配说明
- 原有SQL查询逻辑不需要做任何改动,不管是查询USER_INFO全量记录,还是拼接WHERE条件按un筛选,拿到ResultSet后后续表格写入逻辑完全通用
- 可根据排版需求调整单元格内边距、行间距,直接调用表格对象的对应设置方法即可,不会破坏列对齐结构
- 原有的零散Paragraph输出逻辑可以完全移除,所有用户记录都通过表格单元格承载,不会出现排版错位、内容散乱的问题
内容的提问来源于stack exchange,提问作者japmanw13
相关产品推荐
相关产品推荐

