web项目需要增加报表,报表分为明细表、统计表(多级表头)和图形表(柱状图),思来想去选择了集成jasperreport,这样可以方便后期维护及扩展,虽然初期集成和上手麻烦点,但是可以使用iReport设计器还是省了不少工作。
注意,ireport5.6.0 启动需要1.7jdk,1.8会一闪而过。
1. jasperreport的依赖,集成过程大部分错误都是缺少jar包,maven列表:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-jasperreports-plugin</artifactId>
<version>2.5.10.1</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
一共24个依赖jar包,如下图:
2. struts.xml中基本定义要增加jasper结果类型,最好放在package的第一行避免报错。
<package name="system_default" extends="struts-default">
<result-types>
<result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/>
</result-types>
</package>
3. action的两种配置方式java代码构造数据和直接连接数据库:
<!--1. 程序构造数据-->
<action name="jasper_report_index"
class="com.bnu.questionnaire.plugin.jasperreport.action.JasperReportAction"
method="getInfoCheckIndex">
<result>/${html}</result>
</action>
<action name="jasper_report_getInfoCheckData" class="com.bnu.questionnaire.plugin.jasperreport.action.JasperReportAction">
<result name="success" type="jasper">
<!-- location指定iReport设计器编译产生的jasper报表文件在项目目录的位置 -->
<!-- /项目根目录/${location} -->
<!-- http://localhost:8088/项目名/${location} -->
<param name="location">/jasper/report1.jasper</param>
<!-- dataSource指定数据源action中函数方法,反射getXXXX()方法 -->
<!-- 如下配置示例反射action中的getReportData()方法 -->
<param name="dataSource">reportData</param>
<!-- format指定返回类型,默认PDF -->
<param name="format">HTML</param>
<!-- imageServletUrl指定图片servlet地址 -->
<!-- 不配置会出现报表背景及图形表图片无法显示情况 -->
<param name="imageServletUrl">
<![CDATA[/image?image=]]>
</param>
</result>
</action>
<!--2. 直连数据库-->
<action name="jasper_report_infocheck" class="com.bnu.questionnaire.plugin.jasperreport.action.JasperReportAction">
<result name="success" type="jasper">
<param name="location">/jasper/report1.jasper</param>
<!-- connection指定数据链接,使用直连数据库的方式,反射action中getXXXXX()方法,应返回数据库Connection对象 -->
<param name="connection">jasperConnection</param>
<param name="format">HTML</param>
<!--ireport设计时sql语句中包含查询条件$P{year}和$P{region}-->
<!--也可以通过$P!{where语句}直接替换为查询语句,例如:ireport中设计语句为"select * from tableName $P!{where}",那么action返回参数可以直接定义为map.put("where","where param1 = 'value1' ")-->
<param name="reportParameters">Params</param>
<param name="imageServletUrl">
<![CDATA[/image?image=]]>
</param>
</result>
</action>
3. web.xml关于图片的配置,不配置无法正常显示charts
<!--jasperreport-->
<servlet>
<servlet-name>JasperReportImageServlet</servlet-name>
<servlet-class>
net.sf.jasperreports.j2ee.servlets.ImageServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JasperReportImageServlet</servlet-name>
<url-pattern>/image</url-pattern>
</servlet-mapping>
4. Action伪代码
/**
* Using:报表主页加载数据
*
* @return
*/
public List<DemoModel> getReportData() throws Exception {
List<DemoModel> demoModelList = new ArrayList<>();
demoModelList.add(new DemoModel("test1","100001","李一","oa"));
demoModelList.add(new DemoModel("test2","100002","王二","oa"));
demoModelList.add(new DemoModel("test3","100003","张三","oa"));
return demoModelList;
}
/**
* Using:jasperReport直连数据库,返回Connection对象。
*
* @return Connection
* @throws Exception
*/
public Connection getJasperConnection() throws Exception{
String region = this.getRequest().getParameter("region");
String year = this.getRequest().getParameter("year");
Params.put("year", year);
Params.put("region", region);
Connection connection = this.getConnection();
return connection;
}
/**
* Using:定义返回报表模板的参数
**/
private HashMap Params = new HashMap();
public HashMap getParams() {
return Params;
}