jasperReports

一:jasperReports介紹:  在web應用中,必須面臨大量的報表問題,即將數據庫中的數據形成報表並進行打印。傳統開發只能使用html頁面設計報表,效率低且不支持別的格式。所以jasperReports因運而生。  jasperReports是一款強大的靈活的報表生成工具,能夠生成pdf、html和xml格式的報表,是開源的,可以免費的使用她。並且完全使用java寫成,可以用在各種java程序中(她的文檔是收費的)。二:jar說明:  首先,需要往項目中添加的jar文件有:    核心包:jasperreports.jar,groovy-all-1.7.2.jar,    json-lib-2.4-jdk15.jar    生成pdf組件包:iText.jar  中文字體包:iTextAsian.jar    apache的commons組件包。三:ireport介紹:  iReport是一個能夠創建複雜報表的開源項目。它100%使用Java語言編寫。是目前全球最爲流行的開源報表設計器。因爲jasperReports本身沒有提供很好的可視化報表設計工具,所以iReport很好的彌補了這個問題。  下圖是自己設計的報表:其中Field和Parameters都是動態獲取。 四:代碼:  前臺通過url訪問action中的方法:複製代碼 // pdf打印 public String myprint() throws Exception { InputStream in = userService.genPdf(); ActionContext.getContext().getValueStack().set("pdfStream", in); ActionContext.getContext().getValueStack().set("pdfName", "用戶名單.pdf"); return "mypdf"; }複製代碼  service中的實現方法:複製代碼@Override public InputStream genPdf() { List<User> userLs = this.retrieveAll(null, null, null); Map<String, Object> map = new HashMap<String, Object>(); map.put("printDate", CommonUtil.getChineseDate()); return JasperUtil.exportPdfDir("materialCost.jasper", map, userLs); }複製代碼  JasperUtil實現方法:複製代碼package cn.itcast.oa.util;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.InputStream;import java.util.List;import java.util.Map;import net.sf.jasperreports.engine.JRDataSource;import net.sf.jasperreports.engine.JasperExportManager;import net.sf.jasperreports.engine.JasperFillManager;import net.sf.jasperreports.engine.JasperPrint;import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;/** * 打印工具類 * * @author haojiahong * * @createtime:2015-8-13 下午4:40:27 * * */public class JasperUtil { public static InputStream exportPdfDir(String fileName, Map<String, Object> maps, List<?> ls) { try { JRDataSource ds = new JRBeanCollectionDataSource(ls, false); String filenurl = PathUtil.getWebPath() + "ireport/" + fileName; InputStream file = new FileInputStream(filenurl); JasperPrint jasperPrint = JasperFillManager.fillReport(file, maps, ds); ByteArrayOutputStream out = new ByteArrayOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, out); return new ByteArrayInputStream(out.toByteArray()); } catch (Exception e) { e.printStackTrace(); } return null; }}複製代碼  其中的pathUtil是爲了獲取使用iReport工具設計的報表xml文件,我放在了項目中的這個位置:  pathUtil:複製代碼package cn.itcast.oa.util;import java.io.UnsupportedEncodingException;import java.net.URL;import java.net.URLDecoder;public class PathUtil { public String getWebInfPath() { URL url = getClass().getProtectionDomain().getCodeSource() .getLocation(); String path = url.toString(); int index = path.indexOf("WEB-INF"); if (index == -1) { index = path.indexOf("classes"); } if (index == -1) { index = path.indexOf("bin"); } path = path.substring(0, index); if (path.startsWith("zip")) { path = path.substring(4); } else if (path.startsWith("file")) { path = path.substring(6); } else if (path.startsWith("jar")) { path = path.substring(10); } try { path = URLDecoder.decode(path, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (path.indexOf(":") < 0) { path = System.getProperty("file.separator") + path; } return path; } public static String getWebPath() { return new PathUtil().getWebInfPath(); }}複製代碼五:最終實現效果:報表中的3條數據都是通過數據庫動態獲取到的,這就實現了報表的打印功能。 最後自己遇到的問題:easyUI前臺的彈窗是在底層頁面上的div生成的,所以一開始使用easyUI的彈窗,生成展現出來的pdf亂碼,然後改成瀏覽器打開新窗口,生成正確。字體問題用到了simfang.ttf文件,這個需要加入到項目中的classpath中。轉自:http://www.cnblogs.com/haojiahong/p/4729459.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章