efa's blog

以用户角度出发,你就已经成功一半了.

导航

<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

常用链接

留言簿(18)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

Bi report

dba

info security

other

perl

php

python

tech blogs

tech websites

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

了解jasperreport ,让web报表跑得更好

一、为什么是jasperreport
         很简单两点:
    1 免费
    2 在大多数开源产品中最能满足本人/公司的需求.
       如果要一句话总结那么就是 "适合就好!" ,其次再想插一句"其实jasperreport可以做得更好,只是缺少大家去发现。" 

             在erp软件开发中一套强大易用的报表工具还是相当重要的地位,在这里我只针对一些日常业务报表.
              jasperreport + ireport 报表套装在普通的报表中已做得很不错:流水账式的,分组报表都可以轻松实现.在这里提出的是一些相对特别以及少用到的报表设计问题.
             当前版本 : jasperreport  1.1.0
                                 ireport  : 0.5.2

二、问题与解决
           
1.操作
        初用ireport 设计报表(特别是早期的版本)感觉还是比较原始,相对于birt 类似于在 Dreamweaver中画table 式的设计还是有点差距.但新版本(0.5.2)中也有不小的改善,增加了很多快速对齐,格式化的工具栏以及快捷操作方式.通过结合这些操作还算是方便了不少.

2.分页
           刚接触jasper report ,无论是看其官方的example还是自己动手设计报表,  html view 总给人很深的印象:"怎么字体那么小,而且实际打印一下,分页功能并没真正实现"
        经过客户一轮的抗义,最终还是下定决心去修补一下,
  其实jasper report 原理还是挺简单:
    它默认的分页方式是能过一轮的高度计算,再用两个<br>就以为了事了.

<table>
<tr>
 
<td>
   
<table>
    
   
</table>
   
<br/> <!--两个br分行标记-->
   
<br/>
   
<table>
    
   
</table>
 
</td>
</tr>
</table>


       解决方案:
       好在jasperreport还提供了很好的扩展方案.它允许我们自定义分页方式(就是说在两页/table之间能让我们放自己的代码),自己定义betweenPagesHtml 就OK了,可以能过CSS定义分页.在这里,我就直接改它代码算了.大家可以自己选择.
    
net.sf.jasperreports.engine.export.JRHtmlExporter

<!--CSS代码-->
pageEnd 
{page-break-after:always}

 

if (betweenPagesHtml == null)
                        
{
                            writer.write(
"<br class=\"pageEnd\">");   // 原来是两个 <br/>
                        }
 else
                        
{
                            writer.write(betweenPagesHtml);
                        }

3. 打印
      分页解决后可以发现当报表预览时真的能一页一页分得很好.却又发现了一个问题.报表明显不能满一张A4张大小(ireport 设计选择的是A4纸张),疑惑了一际子,其实不能算是BUG.
   ireport 报表属性中明显(21 * 29.7 CM) 一张A4纸的大小,为什么HTML出来的效果却明显小的那么多了.其实这与计算机的分辨率有关
   计算机中的分辨率,普遍是72 象素/英寸,而打印机普通是300象素/英寸.
   jasperreport 与ireport 默认单位是px,我猜想如果用CM做单位的话可以解决这个问题.但在这里我们的做法是尽量加大报表设计时的宽度与高度.另一个要注意的是记得将所有页边距设为0,因为这些设置在打印的时候已在IE/浏览器中设定了,不用重复.
   
4.分栏
      以前没多注意,但刚用ireport新版本时可以发现在报表属性设计的时候可以设置栏.这下子如果当报表主体部分列数不多时实现分栏显示,以节省纸张.

5.斑马线式显示报表主体
   
有时我们想让报表更美化,让用户更方便地观看数据,可以设置两种色相隔.这种效果在jasperreport 中的example中有demo一下,大家如果想学习可以下载看看.

6.交叉报表

   关于jasperreport的交叉报表设计网上还是有不小的讨论,而真正实现的不多.我观察过大多用jasperreport实现都是伪交叉报表.并不是真正实现真正的动态行与列.
   其实在jaspert report下载包中还是有个交叉报表的实现example(crosstabs),只不过据我了解,现在ireport还不能实现设计.只能通过手工写jrxml文件实现.本人小试一下,还是挺不错的.
 

三、待研究
 通过继承net.sf.jasperreports.engine.export.JRHtmlExporter ,还是能扩展不小的功能.例如用CSS格式化,可以大大减小代码量,动态列/可设列宽度大大增强我们的报表功能.
 现本人初部实现100%宽度,不再用jasperreport中hardcode列度等等,以下三点还有待时间去跟进:)

1.动态列
 
2.可设列宽度

3.CSS设计
  


 

posted on 2005-11-28 20:35 一凡@ITO 阅读(13499) 评论(6)  编辑  收藏 所属分类: Bi report Tools

评论

# re: 了解jasperreport ,让web报表跑得更好 2006-02-15 22:02 kswdgx

有点关于jasperreport的问题请教
我下载了jasperreport1.1.0的代码,其中有许多DEMO但是我却运行不起来,老是报如下错误不知是何原因,但0.68版本却可以,错误如下 :
Buildfile: H:\study\report\jasperreports-1.2.0-project\jasperreports-1.2.0\demo\samples\shapes\build.xml
compile:
[jrc] Compiling 1 report design files.
[jrc] 2006-2-15 21:42:18 org.apache.commons.digester.Digester getParser
[jrc] 严重: Digester.getParser:
[jrc] org.xml.sax.SAXNotRecognizedException: Feature: http://apache.org/xml/features/validation/dynamic
[jrc] at org.apache.crimson.parser.XMLReaderImpl.setFeature(Unknown Source)
[jrc] at org.apache.crimson.jaxp.SAXParserImpl.setFeatures(Unknown Source)
[jrc] at org.apache.crimson.jaxp.SAXParserImpl.<init>(Unknown Source)
[jrc] at org.apache.crimson.jaxp.SAXParserFactoryImpl.newSAXParserImpl(Unknown Source)
[jrc] at org.apache.crimson.jaxp.SAXParserFactoryImpl.setFeature(Unknown Source)
[jrc] at org.apache.commons.digester.parser.XercesParser.configureXerces(XercesParser.java:185)
[jrc] at org.apache.commons.digester.parser.XercesParser.newSAXParser(XercesParser.java:138)
[jrc] at org.apache.commons.digester.ParserFeatureSetterFactory.newSAXParser(ParserFeatureSetterFactory.java:71)
[jrc] at org.apache.commons.digester.Digester.getParser(Digester.java:692)
[jrc] at org.apache.commons.digester.Digester.getXMLReader(Digester.java:899)
[jrc] at org.apache.commons.digester.Digester.parse(Digester.java:1647)
[jrc] at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:238)
[jrc] at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:225)
[jrc] at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:213)
[jrc] at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:167)
[jrc] at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:151)
[jrc] at net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:107)
[jrc] at net.sf.jasperreports.ant.JRAntCompileTask.compile(JRAntCompileTask.java:398)
[jrc] at net.sf.jasperreports.ant.JRAntCompileTask.execute(JRAntCompileTask.java:252)
[jrc] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[jrc] at org.apache.tools.ant.Task.perform(Task.java:364)
[jrc] at org.apache.tools.ant.Target.execute(Target.java:341)
[jrc] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[jrc] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[jrc] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[jrc] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[jrc] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[jrc] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[jrc] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[jrc] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
File : H:\study\report\jasperreports-1.2.0-project\jasperreports-1.2.0\demo\samples\shapes\ShapesReport.jrxml ...

BUILD FAILED
H:\study\report\jasperreports-1.2.0-project\jasperreports-1.2.0\demo\samples\shapes\build.xml:30: java.lang.NullPointerException

Total time: 2 seconds

希望能指点一下,不胜感激,我的邮箱:kswdgx◎163.com
  回复  更多评论   

# re: 了解jasperreport ,让web报表跑得更好 2006-04-03 15:51 kelo

good  回复  更多评论   

# re: 了解jasperreport ,让web报表跑得更好 2006-08-29 17:07 Tedeum

打印问题设置为cm后依然存在  回复  更多评论   

# re: 了解jasperreport ,让web报表跑得更好 2006-12-22 17:45 linger2008

请教,如何能把jasper 生成的多个excel文件,合并为多个sheet的一个文件?我的邮箱 gll1976@yahoo.com.cn  回复  更多评论   

# re: 了解jasperreport ,让web报表跑得更好 2006-12-30 11:30 linger2008

如何分组?  回复  更多评论   

# re: 了解jasperreport ,让web报表跑得更好 2007-04-26 18:18 caoyuan

@kswdgx
我也碰到类似的问题了,一直google不到解决办法,今儿解决了,所以就在这儿回复您吧,虽然看起来我们一问一答的时间差的很远^^

我的环境是win2003 sp2,jdk1.5.0_11,resin-3.1.0

[17:54:11.296] Compiling _jsp/_jsp/_compile__jsp.java
[17:54:12.171] Digester.getParser:
[17:54:12.171] org.xml.sax.SAXNotRecognizedException: http://apache.org/xml/feat
ures/validation/dynamic
[17:54:12.171] at com.caucho.xml.parsers.XmlSAXParserFactory.setFeature(XmlSAXP
arserFactory.java:93)
[17:54:12.171] at org.apache.commons.digester.parser.XercesParser.configureXerc
es(XercesParser.java:185)
[17:54:12.171] at org.apache.commons.digester.parser.XercesParser.newSAXParser(
XercesParser.java:138)

只看到这儿,很容易联想到是xml解析器jar包里的冲突,经排查是xercesImpl.jar包的问题,移出lib即可,这个包记得在我用hibernate时也冲突过,以后还得提防着他点儿^^  回复  更多评论   


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


网站导航: