最近想要进行报表开发,网上一搜基本上都是运用Jasperreport进行报表开发,不仅因为Jasperreport功能强大运用java开发,还因为该项目是使用LGPL协议开源的,故可以自由运用在私有项目上只要你不修改它的源码。现在网上搜到Jasperreport的基本都是配合ireport进行开发的,而且版本基本都是6.0以前的。
进入Jasperreport项目的官网发现有一个软件叫Jaspersoft studio的,它的版本也是6.3.1跟Jar包版本一致,百度一下才知道IReport已经不再进行版本更新了,现在改用Jaspersoft studio进行开发了,该软件是基于Eclipse开发的,当然也是开源免费的。
我将自己运用Jasperreport+studio进行开发的一些经验进行整理,希望对大家有用。
到Jasperreport开发公司官网Jaspersoft community下载Jar包,最好是下载Project包,还有模板开发软件Jaspersoft studio。下载链接
点击Libray和studio进行下载,点击之后会弹出让你注册或者登录的界面,可以点击右下角的NoThanks跳过直接来到下载界面,稍等片刻便会弹出下载对话框。
下载Jasperreposrt6.3.1的Project包后解压,里面的结构如下。
重点文件夹我都做了标识,demo是一些案例。首先来了看第一个文件夹dist,点进去之后里面放着Jasperreport6.3.1的Jar包,还有其它两个相关的包。
第一个文件夹doc里面放着Jar包的Api说明,还有Jasperreport的用户指南,如果你英文好的话可以详细读读。
接下来的文件build.xml是一个非常值得注意的点,由于JasperReport可以用ant工具进行构建,所以这个Project包里的案例都是默认用ant才能运行的,不了解ant的同学可以百度一下ant的教程。
强烈建议安装一个ant构建工具,反正也不大,因为后面会用的到,而ant都是基于build.xml进行构建项目的,所以这里有个build.xml文件。当安装好ant之后,用cmd进入当前项目,可以直接在当前目录的地址栏里输入cmd,然后直接打ant命令,就会开始构建项目了。
那这个ivy.xml又是什么呢,点开看看。
version="2.0">
"net.sf.jasperreports" module="jasperreports">
name="GNU Lesser General Public License" url="http://jasperreports.sourceforge.net/license.html" />
"http://jasperreports.sourceforge.net">JasperReports Library
"compile" defaultconfmapping="compile->*">
name="compile" description="dependencies for compile"/>
name="docs" description="dependencies for docs" extends="compile"/>
name="javaflow" description="dependencies for javaflow" extends="compile"/>
name="test" description="dependencies for test" extends="compile"/>
"antlr" name="antlr" rev="2.7.5"/>
"com.adobe.xmp" name="xmpcore" rev="5.1.1"/>
"com.fasterxml.jackson.core" name="jackson-annotations" rev="2.1.4"/>
"com.fasterxml.jackson.core" name="jackson-core" rev="2.1.4"/>
"com.fasterxml.jackson.core" name="jackson-databind" rev="2.1.4"/>
"com.google.zxing" name="core" rev="3.2.1"/>
"com.lowagie" name="itext" rev="2.1.7.js5"/>
"commons-beanutils" name="commons-beanutils" rev="1.9.0"/>
"commons-collections" name="commons-collections" rev="3.2.2"/>
"commons-digester" name="commons-digester" rev="2.1"/>
"commons-lang" name="commons-lang" rev="2.6"/>
"commons-logging" name="commons-logging" rev="1.1.1"/>
"com.ibm.icu" name="icu4j" rev="57.1"/>
"javax.persistence" name="persistence-api" rev="1.0"/>
"javax.servlet" name="servlet-api" rev="2.4"/>
"jaxen" name="jaxen" rev="1.1.1"/>
"mondrian" name="mondrian" rev="3.1.1.12687"/>
"net.sf.barcode4j" name="barcode4j" rev="2.1"/>
"net.sourceforge.barbecue" name="barbecue" rev="1.5-beta1"/>
"net.sourceforge.jexcelapi" name="jxl" rev="2.6.10"/>
"org.apache.ant" name="ant" rev="1.7.1"/>
"org.apache.commons" name="commons-javaflow" rev="20160505"/>
"org.apache.httpcomponents" name="httpclient" rev="4.3.4"/>
"org.apache.httpcomponents" name="httpcore" rev="4.3.2"/>
"org.apache.lucene" name="lucene-analyzers-common" rev="4.5.1"/>
"org.apache.lucene" name="lucene-core" rev="4.5.1"/>
"org.apache.lucene" name="lucene-queryparser" rev="4.5.1"/>
"org.apache.poi" name="poi-ooxml" rev="3.10.1"/>
"org.apache.poi" name="poi" rev="3.10.1"/>
"org.apache.velocity" name="velocity" rev="1.7"/>
"org.apache.xmlgraphics" name="batik-anim" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-awt-util" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-bridge" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-css" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-dom" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-gvt" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-svg-dom" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-svggen" rev="1.8"/>
"org.apache.xmlgraphics" name="batik-util" rev="1.8"/>
"org.beanshell" name="bsh" rev="2.0b4"/>
"org.codehaus.castor" name="castor-core" rev="1.3.3"/>
"org.codehaus.castor" name="castor-xml" rev="1.3.3"/>
"org.codehaus.groovy" name="groovy-all" rev="2.4.5"/>
"org.eclipse.jdt.core.compiler" name="ecj" rev="4.3.1"/>
"org.hibernate" name="hibernate-core" rev="3.3.2.GA"/>
"org.jfree" name="jcommon" rev="1.0.23"/>
"org.jfree" name="jfreechart" rev="1.0.19"/>
"org.mozilla" name="rhino" rev="1.7.6"/>
"org.olap4j" name="olap4j" rev="0.9.7.309-JS-3"/>
"org.ow2.asm" name="asm-all" rev="4.0" conf="javaflow->*"/>
"org.springframework" name="spring-beans" rev="2.5"/>
"org.springframework" name="spring-core" rev="2.5"/>
"xalan" name="xalan" rev="2.7.2"/>
"xml-apis" name="xml-apis-ext" rev="1.3.04"/>
"xalan" name="serializer" rev="2.7.2" conf="docs->*"/>
--
"com.keypoint" name="png-encoder" rev="1.5"/>
"javax.xml.soap" name="saaj-api" rev="1.3"/>
"org.apache.xmlgraphics" name="batik-script" rev="1.7"/>
"org.testng" name="testng" rev="6.8.1"/>
"log4j" name="log4j" rev="1.2.17"/>
"net.sf.jasperreports" name="jasperreports-fonts" rev="4.0.0"/>
-->
有没感到头晕,有没看到许多的dependency,没错这个就是依赖库的构建,当你运行ant命令后,就会从远程仓库下载所有这些Jar包。
注意:这一步是非常重要的,如果你要用最新版的6.3.1进行开发,并且要用上jasperreport的所有功能,那么你可能得要有上面xml里面的所有包,而且版本一定要对应。否则当你导入JaserperReport Jar包到项目后,你会发现一调用方法填充模板生成PDF或者HTML就会出现各种ClassNotFount异常,像下面这个Jar类库
它是apache基金会开发的一个图像处理类,如果你用的1.7版本或者以下的版本,那么你就会一直报下面这个错误,当初为了解决这个问题,我真是踩了很多坑,最后才发现这个类只有在1.8版本才增加进去的。
java.lang.ClassNotFoundException: org.apache.batik.bridge.FontFamilyResolver
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
ant安装时需要注意的是要在其安装目录下的lib文件夹导入ivy.jar这个包,需要自行下载,下载jar包传送门。如果没有这个ivy.jar,在运行ant命令后,会报下面的错误。
当运行ant命令后,如果出现下面的画面,那么恭喜你已经开始了漫长的下载jar的过程,这个时间可能很久很久。
ant构建的jar包默认放在C盘的用户文件夹下面,有个.ivy的cache文件夹,里面放的就是下载的缓存jar包了,这时可以慢慢地收集jar包了。
当初我创建一个java web项目时,想生成图表,报一个错导一个包,导了很多包后才发现我要导的包都写在这个ivy.xml文件里。当然如果用ant构建的话有可能会遇到网络问题,下载不了有些jar包,毕竟是外国的网站,能下多少就下多少吧,没有的再去其它地方下。我的Jar包有一些是IReport软件里的lib目录拉过来的。
jaspersoft studio就这点不好,不知道要去哪里找到所有的工程需要用到的jar包。在软件安装目录里jaspersoftstudio\plugins,也可以找到一些类,但不是很全。要做一个报表所依赖的包相当的多,当然最后我也会把我可以运行的项目Demo提供出来供大家参考。