先说两句报表框架的选择,JasperReport和BIRT都是不错的JAVA报表工具,不过BIRT和Spring的整合比较麻烦,Spring官网论坛里有篇不错的文章,不过我觉得还是挺麻烦的。而Jasper简单一些。
SpringMVC和JasperReport的整合方法有很多,这里介绍一下Spring文档里的官方方法,这个方法比较简单,编写的代码很少,缺点是不自动,每加一个报表都需要修改配置文件,重启服务。对于专门做报表的WEB服务来说就不合适了。
1、在配置文件中增加:
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <beans:property name="basename" value="views"/> </beans:bean>
注意Resolver的顺序。
2、在classpath里面增加views.properties。我的文件放在src/main/resources下面。
views的内容是:
#设置报表输出格式 simpleReport.(class)=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView #设置报表文件路径 simpleReport.url=/WEB-INF/reports/report1.jasper #数据的key值 simpleReport.reportDataKey=datasource
每一个表报都需要一套如上的配置。spring支持运行时自动选择报表输入格式。详细可以查spring的官方文档。
3、用iReport编辑报表。iReport版本是4.5.1
iReport的pdf有个传统的中文问题,网上有很多介绍文章。在ireport的lib下有itext-2.1.7.jar、iTextAsian-2.1.7.jar和iText-AsianCmaps-2.1.7包。(可在附件中下载)
我以为iReport4.5.1能先进点,没想到还是用iText-2.1.7和配套的其他两个包,别用最新版本,最新版本无效。
1)将上述3个包加到iReport 工具-->选项-->Classpath里
2)iReport 工具-->选项-->Fonts里,将这3个包前面的复选框打钩。
3)在编辑报表的Text框时,编辑其属性如下
Pdf Font name:STSong-Light;
Pdf Embedded:勾上
Pdf Enccoding:UniGB-UCS2-H (Chinese Simplified)
4)将这3个jar包加到Eclipse项目ClassPath下。
这样pdf就可以正常显示中文了。
将编辑好的.jasper文件拷贝到Eclipse项目中。
4、编写Controller。
import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("/report.html") public class ReportCtrl { private static final Logger logger = LoggerFactory.getLogger(ReportCtrl.class); @RequestMapping() public ModelAndView showReport(ModelMap model, HttpServletRequest request) { logger.info("ReportCtrl-showReport start!"); DataSource map = new DataSource(); map.setPlanno("APP1-1039-0990"); map.setPlanname("上海出租车"); List<DataSource> beanData = new ArrayList<DataSource>(); beanData.add(map); model.addAttribute("datasource", beanData); //datasource和views.properties配置的相同 logger.info("ReportCtrl-showReport end!"); return new ModelAndView("simpleReport", model); //simpleReport和views.properties配置的相同 } //bean定义 public class DataSource { private String planno = ""; private String planname = ""; public String getPlanno() { return planno; } public void setPlanno(String planno) { this.planno = planno; } public String getPlanname() { return planname; } public void setPlanname(String planname) { this.planname = planname; } } }
运行就可以显示报表了。