You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 14:57:00