天天看点

Spring MVC+Jasper Report 及生成PDF的中文问题

先说两句报表框架的选择,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;
        }
    }
}
           

运行就可以显示报表了。