先说两句报表框架的选择,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;
}
}
}
运行就可以显示报表了。