若是是少许,简单的报表itext就轻松搞定,可是报表多了,itext会死人的。记录下本人使用ireport+springMVC生成pdfjava
下载并安装ireport
web
将依赖的jar放到lib下面,jasperreports-5.6.0.jar、groovy-all-2.1.3.jar、iText-2.1.7.js2.jar、iTextAsian.jar、iTextAsianCmaps.jar(iTextAsian这几个是解决中文乱码的)spring
继承JasperReportsMultiFormatView类,并重写fillReport()方法,在该方法中增长setUrl()实现,这样就可 以在controller中指定要使用的报表模板文件了。这样作的好处是,只须要一个jasperReport配置文件,能够在controller中动 态的设定报表模板url。
app
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,并指定解析器类为自定义的视图解析器类:ide
<?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中增长下述配置:ui
<!-- 注册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>
--------------------------------分割线-------------------------------------this
java测试代码url
实体类:.net
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目录下:
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.运行效果;
若是上述的中文相关jar都天剑了中文不显示的话:
在生成jasper的时候设置字段属性:
Font name 宋体
Pdf Font name : STSong-Light
Pdf Embedded : true
Pdf Encoding : UniGB-UCS2-H (Chinese Simplified)
简单说下ireport配置javabean数据源:
此处路径为你javabean的class文件地址,
配置完成后左侧就能够看到了:
http://blog.csdn.net/xht555/article/details/43409637