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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.