若是是少許,簡單的報表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