ireport+springMVC生成pdf

如果是少量,简单的报表itext就轻松搞定,但是报表多了,itext会死人的。记录下本人使用ireport+springMVC生成pdf

  1. 下载并安装ireport

  2. 将依赖的jar放到lib下面,jasperreports-5.6.0.jar、groovy-all-2.1.3.jar、iText-2.1.7.js2.jar、iTextAsian.jar、iTextAsianCmaps.jar(iTextAsian这几个是解决中文乱码的)

  3. 继承JasperReportsMultiFormatView类,并重写fillReport()方法,在该方法中增加setUrl()实现,这样就可 以在controller中指定要使用的报表模板文件了。这样做的好处是,只需要一个jasperReport配置文件,可以在controller中动 态的设定报表模板url。

  4. package com.hutong.ms.pdf.controller;
    
    import net.sf.jasperreports.engine.JRDataSource;
    import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.hutong.ms.pdf.entity.UserTest;
    
    /**
     * @author :alex
     * @date :2015年12月17日 下午8:20:05
     * @description:
     */
    @Controller
    public class UserTestController {
    
        @RequestMapping(value="getpdf")
        public String report(Model model) {  
            // 报表数据源  
            JRDataSource jrDataSource = new JRBeanCollectionDataSource(UserTest.getList());  
            // 动态指定报表模板url  
    //        model.addAttribute("url", "/WEB-INF/jasper/MvcIReportExample.jasper");  
            model.addAttribute("url", "/WEB-INF/jasper/test1.jasper");  
            model.addAttribute("format", "pdf"); // 报表格式  
            model.addAttribute("jrMainDataSource", jrDataSource);  
                  
            return "iReportView"; // 对应jasper-defs.xml中的bean id  
        } 
        
    }

4.在/WEB-INF/jasper/目录下创建报表视图配置文件jasper-defs.xml,并指定解析器类为自定义的视图解析器类:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<bean id="iReportView" class="com.hutong.ms.pdf.UserTestIreportView">
<!-- <property name="url" value="/WEB-INF/jasper/report2.jasper"/> -->
<property name="reportDataKey" value="jrMainDataSource">
</property>
</bean>
</beans>

5.Jasper报表的渲染需要用到XmlViewResolver视图解析器,这样你的项目中就会存在多个视图解析器。需要注意的是,项目中如果 使用了多个视图解析器,则需要设置order的值来区分解析器的使用顺序,order值越小则越靠前。增加XmlViewResolver视图解析器的同 时,并指定其要解析的配置文件路径。

那么,需要在/WEB-INF/spring/appServlet/servlet-context.xml中增加下述配置:

<!-- 注册XmlViewResolver,用于iReport & JasperReports报表生成 -->  
    <beans:bean id="jasperReportResolver" class="org.springframework.web.servlet.view.XmlViewResolver">  
        <beans:property name="order">  
            <beans:value>0</beans:value>  
        </beans:property>  
        <beans:property name="location">  
            <beans:value>WEB-INF/jasper/jasper-defs.xml</beans:value>  
        </beans:property>  
    </beans:bean>

--------------------------------分割线-------------------------------------

java测试代码

  1. 实体类:


  2. package com.hutong.ms.pdf.entity;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author :alex
     * @date :2015年12月17日 下午8:16:26
     * @description:
     */
    public class UserTest implements Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        private int id;
        private String name;
        private String nickname;
        private String phone;
        private int age;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "UserTest [id=" + id + ", name=" + name + ", nickname="
                    + nickname + ", phone=" + phone + ", age=" + age + "]";
        }
        
        public UserTest(int id, String name, String nickname, String phone, int age) {
            super();
            this.id = id;
            this.name = name;
            this.nickname = nickname;
            this.phone = phone;
            this.age = age;
        }
        public UserTest() {
            super();
        }
        public static List<UserTest> getList(){
            List<UserTest> list = new ArrayList<>();
            UserTest ut1 = new UserTest(1, "alex", "alex", "18976878", 23);
            UserTest ut2 = new UserTest(2, "alex2", "alex2", "18976878", 23);
            UserTest ut3 = new UserTest(3, "alex3", "alex3", "18976878", 23);
            UserTest ut4 = new UserTest(4, "alex4", "alex4", "18976878", 23);
            UserTest ut5 = new UserTest(5, "alex5", "alex5", "18976878", 23);
            UserTest ut6 = new UserTest(5, "哈哈", "哈哈", "18976878", 23);
            list.add(ut1);
            list.add(ut2);
            list.add(ut3);
            list.add(ut4);
            list.add(ut5);
            list.add(ut6);
            return list;
        }
    
    }

2.使用iReport设计报表模板,并编成.jasper二进制文件,并拷贝至\WEB-INF\jasper目录下:

ireport+springMVC生成pdf_第1张图片

3.Controller代码:

package com.hutong.ms.pdf.controller;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.hutong.ms.pdf.entity.UserTest;

/**
 * @author :zhouyong
 * @date :2015年12月17日 下午8:20:05
 * @description:
 */
@Controller
public class UserTestController {

    @RequestMapping(value="getpdf")
    public String report(Model model) {  
        // 报表数据源  
        JRDataSource jrDataSource = new JRBeanCollectionDataSource(UserTest.getList());  
        // 动态指定报表模板url  
//        model.addAttribute("url", "/WEB-INF/jasper/MvcIReportExample.jasper");  
        model.addAttribute("url", "/WEB-INF/jasper/test1.jasper");  
        model.addAttribute("format", "pdf"); // 报表格式  
        model.addAttribute("jrMainDataSource", jrDataSource);  
              
        return "iReportView"; // 对应jasper-defs.xml中的bean id  
    } 
    
}

4.运行效果;

ireport+springMVC生成pdf_第2张图片


如果上述的中文相关jar都天剑了中文不显示的话:

在生成jasper的时候设置字段属性:

Font name    宋体

Pdf Font name :   STSong-Light

Pdf Embedded  :  true

Pdf Encoding  :  UniGB-UCS2-H (Chinese Simplified)

http://blog.csdn.net/xht555/article/details/43409637


你可能感兴趣的:(ireport+springMVC生成pdf)