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

JasperReport 實戰(四):標簽式報表——雙列佈局與子報表復用

     編輯:Java 相關知識

標簽式報表特徵

如貨運面單、資產標簽、名牌:固定尺寸、重複佈局、左右雙列/多列排版。JasperReport 通過主報表放置多個子報表實現並行渲染。

數據源 (沿用 NameList.xml)

<NameList>
    <Person><Name>強尼</Name><Gender>男</Gender><Age>56</Age></Person>
    <Person><Name>阿美</Name><Gender>女</Gender><Age>23</Age></Person>
    <Person><Name>李麗</Name><Gender>女</Gender><Age>58</Age></Person>
    <Person><Name>傑森</Name><Gender>男</Gender><Age>32</Age></Person>
    <Person><Name>劉三</Name><Gender>男</Gender><Age>21</Age></Person>
</NameList>

核心設計思路:並行雙子報表

JasperReport 線性渲染 (上到下),無法直接實現「左 1 右 2、左 3 右 4」的橫向流。解決方案:

  1. 主報表 detail 區域放置兩個並排的子報表元素
  2. 左子報表渲染奇數行 (1, 3, 5...)
  3. 右子報表渲染偶數行 (2, 4, 6...)
  4. 視覺上形成雙列並行效果

標簽報表效果

抽象模型

關鍵配置:XPath 奇偶分離

左子報表 DataSource Expression

<subreportExpression><![CDATA[
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE})
    .dataSource("/NameList/Person[position() mod 2 = 1]")
]]></subreportExpression>

右子報表 DataSource Expression

<subreportExpression><![CDATA[
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE})
    .dataSource("/NameList/Person[position() mod 2 = 0]")
]]></subreportExpression>
  • position() mod 2 = 1:XPath 選取奇數位置節點
  • position() mod 2 = 0:選取偶數位置節點
  • 同一子報表模板 (LabelTemplate.jrxml) 被雙方復用

主報表設計

子報表模板

左子報表 DataSource

右子報表 DataSource

子報表模板設計要點

  • 固定尺寸 (如 100mm × 50mm),splitType="Prevent" 防止跨頁分割
  • 內部佈局:姓名、性別、年齡字段對應排版
  • 無頁眉頁腳,純內容區

模板下載

Chapter4.zip

總結

標簽式報表的關鍵難點是橫向流佈局,JasperReport 通過主報表並行雙子報表 + XPath 奇偶分組巧妙繞過線性渲染限制。此模式可擴展至三列、四列 (mod 3、mod 4),也適用於名牌、條碼標簽、門票等等寬高固定的重複佈局場景。

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