Heis的Blog

          保持簡單,保持愚蠢
          隨筆 - 29, 文章 - 1, 評論 - 122, 引用 - 0
          數據加載中……

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

               上一篇文章就有人評論說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那種以表格為導向類型的報表工具。但是還是那句話,工具這種東西向來是以需求為導向的,合適就用,不合適沒錢買好的,也湊合用用。
               報表模板及數據源點這里下載。

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

          posted on 2009-03-16 22:40 Heis 閱讀(6234) 評論(9)  編輯  收藏 所屬分類: JasperReport那些事兒

          評論

          # re: JasperReport那些事兒(五)——再說表格式報表  回復  更多評論   

          非常感謝 終于找到這篇文章了
          2010-03-17 16:32 | guoxhvip

          # re: JasperReport那些事兒(五)——再說表格式報表  回復  更多評論   

          你好,我在本地上跑起來了你的例子,確實很好很強大,現在我的數據庫里有倆張表,父子關系的表,想做出跟你一樣的顯示效果,但是沒成功,顯示的很亂,主要是子報表顯示的很亂,我對子報表的<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>是這樣設置的,下面是數據庫腳本和jrxml文件,麻煩你幫我改正一下,謝謝
          create table BAREA
          (
          AREAID VARCHAR2(32) not null,
          AREANAME VARCHAR2(10),
          AREACODE VARCHAR2(10)
          )
          tablespace SAQ
          pctfree 10
          initrans 1
          maxtrans 255
          storage
          (
          initial 64K
          minextents 1
          maxextents unlimited
          );
          alter table BAREA
          add constraint AREAID primary key (AREAID)
          using index
          tablespace SAQ
          pctfree 10
          initrans 2
          maxtrans 255
          storage
          (
          initial 64K
          minextents 1
          maxextents unlimited
          );

          create table BCOMPANY
          (
          BCOMID VARCHAR2(32) not null,
          BCOMNAME VARCHAR2(32),
          BCOMADD VARCHAR2(32),
          BCOMTEL VARCHAR2(16),
          AREAID VARCHAR2(32)
          )
          tablespace SAQ
          pctfree 10
          initrans 1
          maxtrans 255
          storage
          (
          initial 64K
          minextents 1
          maxextents unlimited
          );
          alter table BCOMPANY
          add constraint BCID primary key (BCOMID)
          using index
          tablespace SAQ
          pctfree 10
          initrans 2
          maxtrans 255
          storage
          (
          initial 64K
          minextents 1
          maxextents unlimited
          );

          commit;


          insert into BAREA (AREAID, AREANAME, AREACODE)
          values ('ae111111', '北京', 'bj0001');
          insert into BAREA (AREAID, AREANAME, AREACODE)
          values ('ae222222', '上海', 'sh0001');
          insert into BAREA (AREAID, AREANAME, AREACODE)
          values ('ae333333', '廣州', 'gz0001');
          insert into BAREA (AREAID, AREANAME, AREACODE)
          values ('ae444444', '天津', 'tj0001');
          commit;

          insert into BCOMPANY (BCOMID, BCOMNAME, BCOMADD, BCOMTEL, AREAID)
          values ('cp555555', '廣州白云書店', '白云區', '56234567', 'ae333333');
          insert into BCOMPANY (BCOMID, BCOMNAME, BCOMADD, BCOMTEL, AREAID)
          values ('cp111111', '北京同學書社', '海淀區', '89760009', 'ae111111');
          insert into BCOMPANY (BCOMID, BCOMNAME, BCOMADD, BCOMTEL, AREAID)
          values ('cp222222', '上海學友書店', '浦東區', '78987666', 'ae222222');
          insert into BCOMPANY (BCOMID, BCOMNAME, BCOMADD, BCOMTEL, AREAID)
          values ('cp333333', '上海三聯圖書館', '寧杭區', '56789123', 'ae222222');
          insert into BCOMPANY (BCOMID, BCOMNAME, BCOMADD, BCOMTEL, AREAID)
          values ('cp444444', '天津成章書店', '塘沽區', '67432134', 'ae444444');
          commit;
          2010-03-18 19:47 | DDR

          # re: JasperReport那些事兒(五)——再說表格式報表  回復  更多評論   


          order_two_company.jrxml 文件

          <?xml version="1.0" encoding="UTF-8"?>
          <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"" target="_new" rel="nofollow">http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="order_two_company" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
          <property name="ireport.zoom" value="1.0"/>
          <property name="ireport.x" value="0"/>
          <property name="ireport.y" value="0"/>
          <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
          <defaultValueExpression><![CDATA[]]></defaultValueExpression>
          </parameter>
          <queryString>
          <![CDATA[select * from barea]]>
          </queryString>
          <field name="AREAID" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="AREANAME" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="AREACODE" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <background>
          <band splitType="Stretch"/>
          </background>
          <title>
          <band splitType="Stretch"/>
          </title>
          <pageHeader>
          <band splitType="Stretch"/>
          </pageHeader>
          <columnHeader>
          <band height="26" splitType="Stretch">
          <staticText>
          <reportElement x="164" y="0" width="100" height="26"/>
          <box>
          <pen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <bottomPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          </box>
          <textElement textAlignment="Center">
          <font fontName="PMingLiU" pdfFontName="PMINGLIU.ttf" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
          </textElement>
          <text><![CDATA[地區f]]></text>
          </staticText>
          <staticText>
          <reportElement x="264" y="0" width="100" height="26"/>
          <box>
          <pen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <bottomPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          </box>
          <textElement textAlignment="Center">
          <font fontName="PMingLiU" pdfFontName="PMINGLIU.ttf" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
          </textElement>
          <text><![CDATA[公司]]></text>
          </staticText>
          <staticText>
          <reportElement x="364" y="0" width="100" height="26"/>
          <textElement/>
          <text><![CDATA[電話]]></text>
          </staticText>
          </band>
          </columnHeader>
          <detail>
          <band height="25" splitType="Stretch">
          <textField>
          <reportElement stretchType="RelativeToBandHeight" x="164" y="0" width="100" height="25"/>
          <box>
          <pen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <bottomPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          </box>
          <textElement textAlignment="Center" verticalAlignment="Middle">
          <font fontName="PMingLiU" pdfFontName="PMINGLIU.ttf" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
          </textElement>
          <textFieldExpression class="java.lang.String"><![CDATA[$F{AREANAME}]]></textFieldExpression>
          </textField>
          <subreport>
          <reportElement x="264" y="0" width="200" height="25"/>
          <subreportParameter name="p_areaid">
          <subreportParameterExpression><![CDATA[$F{AREAID}]]></subreportParameterExpression>
          </subreportParameter>
          <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
          <subreportExpression class="java.lang.String"><![CDATA["D:\\ireportxml\\order_sub_area.jasper"]]></subreportExpression>
          </subreport>
          </band>
          </detail>
          <columnFooter>
          <band splitType="Stretch"/>
          </columnFooter>
          <pageFooter>
          <band splitType="Stretch"/>
          </pageFooter>
          <summary>
          <band splitType="Stretch"/>
          </summary>
          </jasperReport>
          2010-03-18 19:49 | DDR

          # re: JasperReport那些事兒(五)——再說表格式報表  回復  更多評論   


          order_sub_area.jrxml 文件

          <?xml version="1.0" encoding="UTF-8"?>
          <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"" target="_new" rel="nofollow">http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="order_sub_area" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
          <property name="ireport.zoom" value="1.0"/>
          <property name="ireport.x" value="0"/>
          <property name="ireport.y" value="0"/>
          <parameter name="p_areaid" class="java.lang.String"/>
          <queryString>
          <![CDATA[select t.*, t.rowid from bcompany t where t.areaid =$P{p_areaid}]]>
          </queryString>
          <field name="BCOMID" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="BCOMNAME" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="BCOMADD" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="BCOMTEL" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="AREAID" class="java.lang.String">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <field name="ROWID" class="oracle.sql.ROWID">
          <fieldDescription><![CDATA[]]></fieldDescription>
          </field>
          <background>
          <band splitType="Stretch"/>
          </background>
          <title>
          <band splitType="Stretch"/>
          </title>
          <pageHeader>
          <band splitType="Stretch"/>
          </pageHeader>
          <columnHeader>
          <band splitType="Stretch"/>
          </columnHeader>
          <detail>
          <band height="25" splitType="Stretch">
          <textField>
          <reportElement stretchType="RelativeToBandHeight" isPrintRepeatedValues="false" x="0" y="0" width="100" height="25"/>
          <box>
          <pen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <bottomPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/>
          </box>
          <textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" lineSpacing="Single">
          <font fontName="PMingLiU" pdfFontName="PMINGLIU.ttf" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
          </textElement>
          <textFieldExpression class="java.lang.String"><![CDATA[$F{BCOMNAME}]]></textFieldExpression>
          </textField>
          </band>
          </detail>
          <columnFooter>
          <band splitType="Stretch"/>
          </columnFooter>
          <pageFooter>
          <band splitType="Stretch"/>
          </pageFooter>
          <summary>
          <band splitType="Stretch"/>
          </summary>
          </jasperReport>
          2010-03-18 19:50 | DDR

          # re: JasperReport那些事兒(五)——再說表格式報表  回復  更多評論   

          麻煩你了,謝謝了,
          郵箱 wangfax88@tom.com
          2010-03-18 19:54 | DDR

          # re: JasperReport那些事兒(五)——再說表格式報表[未登錄]  回復  更多評論   

          如果子報表中的數據超過了一頁,顯示出來是什么樣子
          2010-06-29 11:43 | zhonghua

          # re: JasperReport那些事兒(五)——再說表格式報表[未登錄]  回復  更多評論   

          感激不盡,我可是找了三天三夜啊
          2010-08-15 01:04 | danny

          # re: JasperReport那些事兒(五)——再說表格式報表[未登錄]  回復  更多評論   

          我的數據源是xml,xml數據有三層。
          想用子報表套子報表,實現,總是每個子報表的字段對應所有子子報表的數據。
          請幫忙分析下,如果聽不明白請加QQ26771284.謝謝
          2011-07-20 15:44 | sunny

          # re: JasperReport那些事兒(五)——再說表格式報表  回復  更多評論   

          您好博主,請問怎么設計表格動態列,PDF不顯示中文等問題,希望您能加我QQ:919724144,謝謝!
          2015-08-23 00:04 | 浪跡無恒
          主站蜘蛛池模板: 荆门市| 邳州市| 加查县| 徐水县| 固始县| 夹江县| 桑日县| 城固县| 河东区| 布尔津县| 大厂| 海原县| 蓝田县| 宝丰县| 宁陵县| 东光县| 清苑县| 蕉岭县| 安丘市| 冀州市| 甘孜| 安义县| 民和| 铜山县| 南江县| 冀州市| 沂水县| 赫章县| 澄城县| 定州市| 图们市| 平原县| 常德市| 洪江市| 布拖县| 仁化县| 龙海市| 旌德县| 苏州市| 萨迦县| 怀化市|