程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JasperReport那些事兒(五)——再說表格式報表

JasperReport那些事兒(五)——再說表格式報表

編輯:關於JAVA

上一篇文章就有人評論說Jasperreport不適合中國式報表。我就很奇怪了,我從來沒說Jasperreport適合中國式報表(當然我也沒說不適合)。我寫文章的初衷就是分享技術,工具這種東西向來是以需求為導向的,合適就用,不合適沒錢買好的,也湊合用用。但是程序員往往是沒權去決定那些事兒的,程序員應該是一群能用有限的資源去解決問題的人,何況開源產品使用成本和學習成本都比較低,不用白不用。要一些人看著刺眼或打著打廣告的心態,我就勸你別看,方正我是會繼續寫下去的。扯遠了,回到正題吧。

最近博客留言有問怎麼做“單元格合並的報表”,單看這定義,無從下手啊,我也不知道我理解的意思對不對,上星期做了一個我理解的“單元格合並的報表,希望和那位留言的博友的意思有一點重合就好了。看一下效果吧。

數據源結構:

<?xml version="1.0" encoding="utf-8" ?>
<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>

都說中國的報表是大表中有小表,這其實和關系數據庫的表格概念有很大的不同。關系數據庫的表格是簡單的二維表格,不會在表格裡再嵌套表格。那遇到這類型的表格應該怎麼處理呢?我在前面的文章有講怎麼制作簡單的二維表格,所以這篇主要是解決表格前面的單元格合並的問題。

這裡還要借助子報表,子報表是Jasperreport最為強大的功能,也是最具擴展性的功能組件(純粹個人意見)。

做這樣的表格我是用了三個報表模板。

第一個,DepartmentList.jrxml.(編譯後為jasper後綴名)

第二個,DepartmentList_department.jrxml.

第三個,DepartmentList_department_person.jrxml.

調用關系是第一個模板調用第二個,第二個模板再調用第三個。

 DepartmentList.jasper.
|-DepartmentList_department.jasper.
|-DepartmentList_department_person.jasper.

在第二個報表給子報表傳遞數據源時,表達式要像下面這樣寫。這樣寫主要目的是選擇當前department節點下的所有person節點。

((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("/DepartmentList/list/Department["+$V{REPORT_COUNT}.intValue()+"]/personList/person")

REPORT_COUNT變量是指當前detail band內的計數器。例如,從父報表傳過來的數據源的節點數是3,則REPORT_COUNT會從1到3遍歷,detail band也會渲染3次。這裡的XPATH是遍歷了第一個到第三個Department下的所有person節點。

這裡值得一提的是在第二張報表的部門那個textfield裡有個屬性需要注意,Stretch Type設置為"relative to band height",就是讓textfield自動往下延伸,延伸到與其所在的區域(band)相同的高度。

說句實話,在Jasperreport裡面處理表格的確是一件很麻煩的事(指以XML為數據源),像上文提到的表格是很簡單的例子,但是卻要用到三個模板。而且Jasperreport報表是線性渲染(由上到下),所以無論從靈活性和還是效率來說,都比不上像Excel那種以表格為導向類型的報表工具。但是還是那句話,工具這種東西向來是以需求為導向的,合適就用,不合適沒錢買好的,也湊合用用。

程序員的一生其實可短暫了,這電腦一開一關,一天過去了,嚎;電腦一開不關,那就成服務器了,嚎……

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved