使用 JasperReports 制作报表
JasperReports 是用于设计和生成报表的 Java 库。报表版式保存在 `.jrxml` 模板中,数据可来自数据库或 Java 对象,最后导出为 PDF、Excel 或 HTML。本文说明模板结构,并提供根据数据行生成报表的代码。
测试说明:编写本文所用的电脑没有 JasperReports 库,因此代码未在此运行。请按照项目文档添加依赖,并自行测试。
需要准备的东西
- JDK 17 或更新版本
- 通过 Maven 引入的 JasperReports 库(例如 `net.sf.jasperreports:jasperreports`)
- Jaspersoft Studio 等设计工具(可拖放设计模板)
工作原理
第 1 步:设计模板
`.jrxml` 文件是 XML,定义数据字段、页眉、明细行和页脚。字段示例:
<field name="name" class="java.lang.String"/>
<field name="score" class="java.lang.Integer"/>
在 `<detail>` 区域添加引用 `$F{name}` 和 `$F{score}` 的 `textField`,用于显示每一行的值。
第 2 步:准备数据并生成报表
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.List;
import java.util.Map;
public class ReportDemo {
public static class Row {
private final String name;
private final int score;
public Row(String name, int score) { this.name = name; this.score = score; }
public String getName() { return name; }
public int getScore() { return score; }
}
public static void main(String[] args) throws Exception {
List<Row> rows = List.of(new Row("สมชาย", 85), new Row("สมหญิง", 72));
JasperReport report = JasperCompileManager.compileReport("scores.jrxml");
JasperPrint print = JasperFillManager.fillReport(report, Map.of(), new JRBeanCollectionDataSource(rows));
JasperExportManager.exportReportToPdfFile(print, "scores.pdf");
}
}
- `compileReport` 将 `.jrxml` 转换为可运行的形式。
- `fillReport` 把模板与数据结合起来。
- `exportReportToPdfFile` 导出 PDF 文件。
常见错误
- **字段名与 getter 不一致:** 名称必须完全一致。
- **泰语字体不显示:** 在模板中并在系统中设置支持泰语的字体。
- **未设置编码:** 确保 `.jrxml` 文件和代码中的字符串为 UTF-8。
下一步
在报表中添加分组,例如按科目汇总,或把学校名称作为参数传入。
总结
JasperReports 将版式与数据分开。模板定义外观,代码填充数据,最后导出为所需格式。这样不必修改主要代码就能调整报表版式。