關係型數據是扁平二維表,但中國式報表常需主表套子表、單元格跨行合併 (如部門名併合多行員工)。JasperReport 通過子報表優雅解決。
<DepartmentList>
<list>
<Department>
<name>行政部</name>
<personList>
<person><age>35</age><gender>男</gender><name>張三</name></person>
</personList>
</Department>
<Department>
<name>技術部</name>
<personList>
<person><age>30</age><gender>男</gender><name>李四</name></person>
<person><age>28</age><gender>女</gender><name>王五</name></person>
</personList>
</Department>
</list>
</DepartmentList>
| 模板 | 角色 | 關鍵配置 |
|---|---|---|
| 1. DepartmentList.jrxml | 主報表 | 遍歷 Department,調用子報表 2 |
| 2. DepartmentList_department.jrxml | 部門子報表 | 顯示部門名 (Stretch Type=Relative to Band Height 實現合併),調用子報表 3 |
| 3. DepartmentList_department_person.jrxml | 人員明細子報表 | 遍歷 personList,顯示員工明細 |




在部門子報表中傳遞人員數據源:
<subreportExpression><![CDATA[
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE})
.dataSource("/DepartmentList/list/Department[" + $V{REPORT_COUNT}.intValue() + "]/personList/person")
]]></subreportExpression>
$V{REPORT_COUNT}:當前 detail band 渲染計數 (1-based)
Stretch Type = "Relative to Band Height"Position Type = "Float" 防止重疊DepartmentList.jasper
└─ DepartmentList_department.jasper (遍歷 Department)
└─ DepartmentList_department_person.jasper (遍歷 personList)
| 優點 | 缺點 |
|---|---|
| 純 XML 數據源,無需資料庫 | 線性渲染 (上到下),不靈活 |
| 子報表機制強大,支援任意嵌套 | 複雜表格需多模板,維護成本高 |
| Stretch Type 巧妙實現合併視覺 | 非真正單元格合併,導出 Excel 可能異常 |
| 工具可視化設計 (iReport/Studio) | 性能不如 Excel 模板引擎 (POI/JXLS) |
JasperReport 處理中國式複雜表格的核心策略:子報表遞歸嵌套 + XPath 動態數據源 + Stretch Type 視覺合併。雖然模板數量較多、線性渲染有局限,但在「無資料庫、純 XML、標準 Java 檔」約束下,是可行的工程方案。若項目允許,Apache POI / JXLS / EasyExcel 直接操作 Excel 模板往往更高效、體驗更好。