首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JasperReport 實戰(五):複雜表格報表——子報表實現單元格合併與主從嵌套

     編輯:Java 相關知識

痛點:中國式複雜表格 vs 關係型數據結構

關係型數據是扁平二維表,但中國式報表常需主表套子表、單元格跨行合併 (如部門名併合多行員工)。JasperReport 通過子報表優雅解決。

數據源結構 (XML)

<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,顯示員工明細

最終報表效果

主報表設計

部門子報表設計

人員子報表設計

關鍵技術點

1. 子報表數據源傳遞:XPath 精確定位

在部門子報表中傳遞人員數據源:

<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)
  • 動態拼接 XPath,定位到當前部門節點下的人員列表

2. 單元格合併:Stretch Type = Relative to Band Height

Stretch Type 設置

  • 部門名 TextField 設置 Stretch Type = "Relative to Band Height"
  • 使其垂直拉伸填滿整個 Band 高度,視覺上實現跨行合併效果
  • 配合 Position Type = "Float" 防止重疊

3. 調用鏈關係

DepartmentList.jasper
└─ DepartmentList_department.jasper (遍歷 Department)
   └─ DepartmentList_department_person.jasper (遍歷 personList)

優缺點總結

優點缺點
純 XML 數據源,無需資料庫線性渲染 (上到下),不靈活
子報表機制強大,支援任意嵌套複雜表格需多模板,維護成本高
Stretch Type 巧妙實現合併視覺非真正單元格合併,導出 Excel 可能異常
工具可視化設計 (iReport/Studio)性能不如 Excel 模板引擎 (POI/JXLS)

模板下載

Chapter5.zip

總結

JasperReport 處理中國式複雜表格的核心策略:子報表遞歸嵌套 + XPath 動態數據源 + Stretch Type 視覺合併。雖然模板數量較多、線性渲染有局限,但在「無資料庫、純 XML、標準 Java 檔」約束下,是可行的工程方案。若項目允許,Apache POI / JXLS / EasyExcel 直接操作 Excel 模板往往更高效、體驗更好。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved