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 阅读(6210) 评论(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 | 浪迹无恒

只有注册用户登录后才能发表评论。


网站导航: