一:jasperReports介绍:

  在web应用中,必须面临大量的报表问题,即将数据库中的数据形成报表并进行打印。传统开发只能使用html页面设计报表,效率低且不支持别的格式。所以jasperReports因运而生。
  jasperReports是一款强大的灵活的报表生成工具,能够生成pdf、html和xml格式的报表,是开源的,可以免费的使用她。并且完全使用java写成,可以用在各种java程序中(她的文档是收费的)。

二:jar说明:

  首先,需要往项目中添加的jar文件有:

    核心包:jasperreports.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);
}
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中。

搭建第一个web项目:jasperReports+ireport制作pdf报表的更多相关文章

  1. 使用Maven+ssm框架搭建一个web项目

    1,前期准备:Eclipse(Mars.2 Release (4.5.2)).jdk1.7.tomcat7.maven3.2.1 2.使用eclipse中的maven新建一个web项目 点击next: ...

  2. 使用Intellij IDEA搭建Ext JsMVC web项目

    由于自己从android开发转来学习web开发,最近在学习Jsp,之前接触过一点Extjs,所以用jsp来配合ext试试. Ext JS介绍 extjs是一个javascript框架,它的好处就是有它 ...

  3. 建立一个node.js服务器(使用express搭建第一个Web环境)

    一.官网下载node.js 下载地址:https://nodejs.org/en/download/ 根据向导,下一步安装就可以了! 二.使用express搭建Web环境 express是一个开源的n ...

  4. 使用express搭建第一个Web应用【Node.js初学】

    来源:http://jingyan.baidu.com/article/bad08e1ee501e009c8512106.html express是一个开源的node.js项目框架,初学者使用expr ...

  5. JavaWeb从0开始学(一)-----搭建第一个Web应用程序与JSP工作原理

    以往学习的时候大多是看完书或者看完视频,动手实践一下就OK了.然而过了一段时间我发现东西都忘差不多了,需要复习才能重新掌握.现在开始学习JavaWeb了,我将在这里记录自己的学习的一点一滴,不仅便于自 ...

  6. SpringBoot的第一个web项目

    这一节主要是讲springboot搭建简单的web项目. 首先pom文件新增spring-boot-starter-web依赖,pom文件如下所示 <?xml version="1.0 ...

  7. linux系统上部署一个web项目

    对于apache开源项目中tomcat的认识,大多停留在Windows下,这次我通过一个简单的实例来介绍一下在linux下如何搭建tomcat环境,并且部署一个web项目. 先从基本安装开始,可别小看 ...

  8. 一个web项目中web.xml<context-param>的作用

    转   <context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置 ...

  9. eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)

    在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会 ...

随机推荐

  1. 选择一本C++教材

    从上周开始写如何使用C++编程以后,我发现这不是一个容易的题目.因此,我认真的看了一下C++相关的材料,发现现在为止,比较好的材料还是这些: 初学者: Accelerated C++,这是一本学习起来 ...

  2. jquery网页字体变大小

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Ehcache(08)——可阻塞的Cache——BlockingCache

    http://haohaoxuexi.iteye.com/blog/2119737 可阻塞的Cache—BlockingCache 在上一节我们提到了显示使用Ehcache锁的问题,其实我们还可以隐式 ...

  4. PL/pgSQL的anyelement例子

    http://www.postgresonline.com/journal/archives/239-The-wonders-of-Any-Element.html 定义函数 pgsql=# CREA ...

  5. MySQL 127.0.0.1和localhost本质区别

    登录方式: [root@10-4-14-168 ~]# mysql -uroot -p Enter password: 查看权限表 mysql> SELECT user,host,passwor ...

  6. Swift学习笔记十三

    初始化 初始化是一个在类.结构体或枚举的实例对象创建之前,对它进行预处理的过程,包括给那个对象的每一个存储式属性设定初始值,以及进行一些其他的准备操作. 通过定义初始化器(initializer)来实 ...

  7. Some tips on using HashSet<T> and List<T>

    This article is written based on my colleague's review Most of the times, when I want to use a colle ...

  8. android手机打电话代码分析

    智能手机的打电话功能是由RIL部分来实现的,见下图: 开始分析Android源代码中的RIL部分. 又上图,以及其他相关资料,我得知在Android中有一个叫rild的守护进程.我猜测此进程与电话的拨 ...

  9. 云服务器 ECS Linux 磁盘空间满(含 innode 满)问题排查方法

    问题描述 在云服务器 ECS Linux 系统内创建文件时,出现类似如下空间不足提示: No space left on device … 问题原因 导致该问题的可能原因包括: 磁盘分区空间使用率达到 ...

  10. Feister network

    在密码学中,Feister network(又叫Feister Function, 一下简称 F函数)是一种用在块加密上的对称结构,很多种块加密算法都是使用这种结构. 优点: 1.加解密的过程非常相似 ...