Heis的Blog

保持简单,保持愚蠢
随笔 - 29, 文章 - 1, 评论 - 122, 引用 - 0
数据加载中……

JasperReport那些事儿(四)——制作标签式报表

    最近在想《JasperReport那些事儿》系列的写作方向的问题,是要先写Jasper的原理和基础方面,还是写怎么制作报表实例。如果你想我写一些你感兴趣的部分,可以在文章后面加评论告诉我。这周先写一篇制作报表实例的文章吧。
    最近在blogjava看到一篇总结报表图例的文章http://www.blogjava.net/report9d/archive/2009/03/04/257848.html。总结的相当不错,如果你不知道什么是标签式报表,可以看看。

1.先上效果图


2.数据源还是沿用NameList XML数据源,关于怎么配置数据源可以看这里
<?xml version="1.0" encoding="utf-8" ?>
<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>  

3.制作报表的思路
  在制作标签报表的时候,我们先来理清一下思路。可以发现,其实标签式报表的每个小标签内的内容类型都是一样的,这样可以认为报表是由多个标签组成的。这样就可以分离出主体报表和子报表的概念,这与Jasperreport里的subreport(子报表)概念是一样的。这样就可以大概抽象出一个标签式报表的模型了,在主体报表上使用两个subreport元素指向同一个标签报表。

  那为什么要使用两个subreport元素?我们先来看我们期待输出的标签模型的顺序。
  但是在Jasperreport里,报表的渲染是从上到下的。所以我们期待的顺序是先渲染1号标签,然后渲染2号标签,这是从左到右的渲染,在Jasperreport里面是做不到的。但是我们可以采用同时渲染1号和2号标签,这就需要两个subreport元素。
4.具体步骤(关于子报表的制作,可以参考我的第一篇文章)
a)建立一个主模板,加入两个subreport。

b)建立一个子模板(标签模板)。


c)配置subreport的XPATH。
左边的subreport的Datasource配置

右边的subreport的Datasource配置


报表模板下载:http://www.blogjava.net/Files/heis/%E5%9B%9B-%E5%88%B6%E4%BD%9C%E6%A0%87%E7%AD%BE%E5%BC%8F%E6%8A%A5%E8%A1%A8/Chapter4.zip



程序员的一生其实可短暂了,这电脑一开一关,一天过去了,嚎;电脑一开不关,那就成服务器了,嚎……

posted on 2009-03-08 15:33 Heis 阅读(4110) 评论(12)  编辑  收藏 所属分类: JasperReport那些事儿

评论

# re: JasperReport那些事儿(四)——制作标签式报表[未登录]  回复  更多评论   

看了大大的四篇,发现自己的问题有了解决方法,大大是把查询结果弄成XML数据源,然后再把它们读取到报表,这就解决了直接对数据库绑定数据源造成无法对条件搜索进行报表了。这样又要涉及XML的读写问题,如果我的数据有好几万条一次性写入XML不知道会不会效率有问题,我第一次接触报表,请多多指教,谢谢
2009-03-09 09:16 | 游上岸的鱼

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

@游上岸的鱼
使用XML作为数据源比直接读取数据库更有优势的地方在于:
1.数据可以在程序里处理;
2.数据独立性和可读性好

但是劣势也是很明显的,因为要从数据库读取数据到对象,对象再转换为XML,这个过程消耗的资源要更多,效率也会受到影响。具体的效率我也没测试过,但是我在项目里生成的XML在一万行左右时,效率是可以接受的。
但是对于效率要求比较高的报表,但是数据不需要做中间处理的报表,我并不推荐XML作为数据源这种方式。
2009-03-09 10:20 | Heis

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

这样的报表做起来很麻烦,而且多个子报表效率无疑会很底,楼主有没有想过jasperReport的API支持多结果集的报表,也就是针对报表上不同的块解释不同的SQL填充?而且楼主所说的标签式报表完全可以通过简单的一个jrxml文件通过分栏操作完成
2009-03-09 17:08 | 凌晨风

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

@凌晨风
首先,针对你说的“报表做起来很麻烦”。我前面的文章有说过,以XML作为数据源是针对不同的需求的,请考虑下面的几种情况:如果你的报表数据要经过一系列的精确计算,然后在报表上展示计算结果;如果你的报表数据并不是全部都来自于数据库,而是某些来自程序或其他配置文件;SQL能不能解决问题?

其次,我不能认同“多个子报表效率无疑会很底”这句话。标签式报表主体报表的subreport元素都是指向相同的子报表模板。这相当于java中一个类调用同一个类的多个实例,这样并不会有效率问题。使用“无疑”这个词并不是程序员应有的素质,至少你应该先去运行一下这个报表。

我猜想你说的“多结果集”是指subdatasets,这个是只适用于连接(Connection)类型的数据集(像数据库,Hibernate之类),并不适用于数据源(Data Source)类型的数据集(像XML,CSV之类)。

对于你的“分栏”操作,我并不是很理解,请赐教。
2009-03-09 20:00 | Heis

# re: JasperReport那些事儿(四)——制作标签式报表[未登录]  回复  更多评论   

感觉这样介绍没实际意义 因为JasperReport并不适合中国的报表,很多都做不出来,建议你看看润乾报表,不要在这里给大家推荐一个不适合中国的报表!
2009-03-10 08:52 | john

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

@Heis
博主说的很有道理,需求不同,中国式复杂的报表的确做起来很麻烦.
我也是发表一下个人意见而已.大家共同学习啊!
我接触过jasper的api,底层针对子报表采用io加载,编译jasper文件,之后.java文件,博主可以跟踪调试一下多子报表的例子看看,程序运行时会在你的硬盘上写文件之后编译加载到内存后删除掉,放开底级别的日志就可以看出来.
我们的系统是跑在局域网的,运行起来都不是很理想.至于报表上展示的数据和图表等等需要特殊经过计算的数据我是采用scriplet处理,而底层只需要一个简单的connection就可以(主要是考虑到我们的报表系统是给用户使用的,而用户只会一些简单的sql,配上我们封装的scriplet就可以达到想要的效果).
关于那个"分栏",我是看了这个效果图才有此说法,至于是不是和你的需求一致那大家就应该多交流了:先说说我的想法:分成两列横着打印就可以出现你要的这种效果图,不知道博主是不是这个意思?学习学习!
2009-03-10 09:04 | 凌晨风

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

@john
JasperReport不是不适合中国报表,只是它不是为中国报表而设计!jasperReport功能很强大,只要你有想象力完全可以定制所需要的报表,关键是它开源,是一个纯java报表,如果你是跨系统那么它是首选,前提是你有足够的时间和耐心哦
2009-03-10 09:11 | 凌晨风

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

@john
那你的意思是适合中国的报表才有意义?那什么是中国式的报表呢?
2009-03-10 19:18 | Heis

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

@凌晨风
“分成两列横着打印”是不是指像我现在的报表逆时针转90度。如果是,那在Jasperreport里是做不到的。文章中也有提及,Jasperreport是只能一个区域(band)一个区域地去渲染,因为区域的排列是由上到下,所以渲染的顺序也是从上到下的,没办法从左到右渲染。
2009-03-10 19:26 | Heis

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

不是指报表逆时针转90度,而是数据横向排列
2009-03-11 08:52 | 凌晨风

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

JasperReport似乎支持横向label
http://jasperforge.org/website/jasperreportswebsite/trunk/samples.html?group_id=252
2009-08-02 15:23 | caper

# re: JasperReport那些事儿(四)——制作标签式报表  回复  更多评论   

blog的布局和字体怎么这么难看?
2009-11-10 10:45 | yzc

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


网站导航: