`
sarin
  • 浏览: 1757048 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173675
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368147
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189276
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99851
社区版块
存档分类
最新评论

使用JasperReport制作PDF,Excel报表(Struts2实现)

阅读更多
    JasperReport是一款非常优秀的Java开源报表API,它利用模板文件和数据源可以动态生成各种报表,并且提供模板制作工具iReport。网上有很多JasperReport的教程,不过大多都是拷来拷去,想制作一个报表还真难。最近项目组有PDF报表的需求,就把JasperReport报表的基础结合实例学了一遍。以一个例子来说明报表的做法,并结合当红Web框架Struts2来说明,其他框架都大同小异,但是本质不变。
    JasperReport编辑好后生成XML模板文件JRXML和它独有的JASPER模板,使用二者之一即可在Web应用中编译运行。
    首先,是下载API组件,到JasperReport的官网http://jasperforge.org/下载Jar开发包和模板制作工具iReport。下载完成,安装iReport。需要说明的是iReport的版本要和Jar的版本一致,否则会导致模板文件不识别的问题,这里都用3.7.2的版本来说明。
    打开iReport,点击文件->New,选择Report中的一个模板,这里我选择空白A4页面来做演示,可以任我书写。

    下一步给模板起名字,选择存放路径。下一步选择查询数据源,点击New新建,选择合适的数据连接即可,这里选择Database JDBC Connection,并选择MySQL作为数据库服务,后面的配置虽然是英文的,但是见名知义,就很简单了。
    数据库配置完毕,就开始写SQL语句,这里不要挂where子句,只是select语句即可,不过要注意,字段名必须as重命名,否则到web应用中将会出现找不到字段的问题,如果列名太多,就耐心的一个一个写完。

    这里我已经耐心的写完了,是一个简历库,字段比较多。第四步是选取字段,当然都选过来就行了。第五步是Group By就是分组设置,如果报表中需要合并单元格之类的高级操作,那么就需要考虑合理的分组显示了,我们演示不涉及高深操作。这里是和业务挂钩的,必须开发者自行研究了。然后就Finish了,得到一个完整的工作区。

    左面是文档的结构,当前已经给我们分好了栏位,可以不全用,不需要的删除即可。中间是文档工作区,是我们创作的区域,右边是工具栏,有属性,控件等。属性工具栏提供对文档元素的控制,如大小,字体等。控件工具栏提供文档可以使用的控件,常用的是静态文本和属性文本。大家可以自行尝试使用,这里给出一个设计好的模板。

    不需要改变的单元就是Static Text,需要动态变化的是Text Field。拖放好位置后右键Edit Expression即可修改表达式,iReport支持函数和参数定义,非常强大,支持运算,这里我们只选择已有字段的名即可。
    设置好后,开始对中文进行处理,因为默认做好的模板是不支持中文显示的,在模板中修改字体属性,如下图。

    这里只需设置Font Name,PDF Embedded勾上,上面那个选STSong-Light,PDF Encoding选择UniGB-UCS2-H即可。当然在Web应用中还需要一些支持PDF中文的Jar依赖,后面说明。注意任何字段不能遗漏,否则在编译JRXML时会报错。
    模板制作完毕,拷贝JRXML文件出来,我们使用编译JRXML即可,而且这是可以阅读的XML文档。下面就是往Web应用中集成,我们使用Struts2,由于Struts2先天已经支持JasperReport的视图显示,拷贝插件包(Struts2的源码包中可以找到)到编译路径即可。这里我们不使用它提供的,而是自己做,感觉更容易理解。
    在webapp目录(MyEclipse里默认是WebRoot目录)下新建文件夹jasper存放模板文件。

    在Struts2中采用简单的处理方式,可以这样进行。
public String printResumeToPDF() throws Exception {
		String jrxmlPath = getServletContext().getRealPath(
				"/jasper/sovoResume.jrxml");
		List resumeInfo = getServMgr().getUserService().getResumeForDataSource(
				getLoginUserId());
		Map<String, String> parameters = new HashMap<String, String>();
		parameters.put("SUBREPORT_DIR", getServletContext().getRealPath(
				"/jasper"));
		JRDataSource dataSource = new JRBeanCollectionDataSource(resumeInfo);
		JasperReport report = JasperCompileManager.compileReport(jrxmlPath);
		JasperPrint jasperPrint = JasperFillManager.fillReport(report,
				parameters, dataSource);
		HttpServletResponse response = ServletActionContext.getResponse();
		OutputStream ouputStream = response.getOutputStream();
		// 设置相应参数,以附件形式保存PDF
		response.setContentType("application/pdf");
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ URLEncoder.encode(getLoginUserRealName() + "的个人简历", "UTF-8")
				+ ".pdf\"");
		// 使用JRPdfExproter导出器导出pdf
		JRPdfExporter exporter = new JRPdfExporter();
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
		exporter.exportReport();// 导出
		ouputStream.close();// 关闭流
		return null;
	}

    JRDataSource可以有很多中类型,这里使用的是JRBeanCollectionDataSource,参数是Collection类型的,那么使用List封装数据库操作提取的结果即可。这里使用Spring提供的JdbcTemplate对象的queryForList方法获取结果。
public List getResumeForDataSource(Integer empId) {
		return jt.queryForList(SQL_GET_RESUME_FOR_DATASOURCE,
				new Object[] { empId });
	}

    只需传入SQL语句,就是我们在iReport中写的那个,然后加让where子句获取单一记录即可。而要获取Excel,就把生成PDF部分的代码替换为:
// 设置相应参数,以附件形式保存XLS
		response.setContentType("application/vnd.excel");
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ URLEncoder.encode(getLoginUserRealName() + "的个人简历", "UTF-8")
				+ ".xls\"");
		// 使用JRXlsExporter导出器导出xls
		JRXlsExporter exporter = new JRXlsExporter();
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
		exporter.exportReport();// 导出
		ouputStream.close();// 关闭流

    其他都是不变的。之后配上Struts2的Action就可以访问了。还有几点需要说明:JasperReport所依赖的JAR包可以在运行时报错中去补充,这里给出所需依赖:apache-common的digester,beanutils,collections。Groovy包。iText2.1.7,它当前版本是5了,但是用2.1.7就行,因为新版本的package结构有所改变。处理中文的iTextAsian和iTextAsianCmaps,生成Excel需要POI包,如果没记错的话,就是这么多了。
     最后注意系统运行环境,Linux下所需的字体可能没有,而Windows下是有的,所以服务器需要有字体才能生成报表,否则就会报错说字体不存在。这个操作很简单:把windows的中文字体(一般在C:\Windows\Fonts目录),复制到linux的/usr/share/fonts/chinese/TrueType目录下即可。最终我们得到的运行结果如下:

    希望对大家有用,如果有对iReport和JasperReport有深入研究的欢迎交流。
  • 大小: 56.7 KB
  • 大小: 134.3 KB
  • 大小: 133.2 KB
  • 大小: 80.8 KB
  • 大小: 39.8 KB
  • 大小: 8.8 KB
  • 大小: 133.1 KB
19
5
分享到:
评论
20 楼 q188784048 2015-06-23  
iris_1992 写道
2005年以前,国外开原报表完全碾压国产软件,但是现在国内软件,像帆软、FineBI,都比较牛掰了,设计模式和数据处理方面优于开源报表,真犯不着再用ireport了,

完爆ireport啊

你装毛线大神啊。别人是为了解决问题而来。你tmd为了装b而来!有必要吗?
19 楼 iris_1992 2015-04-30  
2005年以前,国外开原报表完全碾压国产软件,但是现在国内软件,像帆软、FineBI,都比较牛掰了,设计模式和数据处理方面优于开源报表,真犯不着再用ireport了,

完爆ireport啊
18 楼 Washingtion 2015-01-28  
List resumeInfo = getServMgr().getUserService().getResumeForDataSource( 
                getLoginUserId());

这个作为配置数据源里面的参数,具体的东西我不知道,没有看明白
17 楼 wk82254887 2014-04-02  
楼主可否给个demo,非常感谢,82254887@qq.com
16 楼 roboa 2014-02-23  
不错啊! 学习学习!
15 楼 FireZHFox 2013-04-22  
楼主可否给个struts2+jasperport的demo,学习一下 335064178@qq.com,非常感谢
14 楼 huangdayang 2013-03-15  
,看起来很不错,先拿去试试先
13 楼 wangkongchao 2013-03-03  
:    
12 楼 Internetcn 2012-12-19  
写的不错,mark。。。。。。
11 楼 sarin 2012-05-06  
gzcsschen 写道
你好我有个问题就是
我如果打印出表格形式的样子

但是最后一页如果只有一条数据
表格就只有一行
不是用的表格元素是用textfield拼接模拟的

就出现这样的效果





name age sex
张山  10   李四








页数 10
我们怎么用空的格子把中间空白的区域填充上去呢


您好,我不知道JasperReport有没有这种默认填充的选项,但应该可以遍历空数据来填充吧,这是我能想到的一种方法。
10 楼 gzcsschen 2012-05-06  
你好我有个问题就是
我如果打印出表格形式的样子

但是最后一页如果只有一条数据
表格就只有一行
不是用的表格元素是用textfield拼接模拟的

就出现这样的效果





name age sex
张山  10   李四








页数 10
我们怎么用空的格子把中间空白的区域填充上去呢

9 楼 sarin 2011-10-12  
jjcoaljj 写道
你好,我做的报表导成excel的时候下方有很大的空白,怎么去掉?我已经设置了
选项-》输出格式选项-》XSL Exporter 中选择参数 IS Remove Empty Space Between Rows 、Is Remove Empty Space Between Colums打钩选中;

O(∩_∩)O谢谢

只能调整元素的高度了,这个好像还不能自动填充吧
8 楼 jjcoaljj 2011-10-12  
你好,我做的报表导成excel的时候下方有很大的空白,怎么去掉?我已经设置了
选项-》输出格式选项-》XSL Exporter 中选择参数 IS Remove Empty Space Between Rows 、Is Remove Empty Space Between Colums打钩选中;

O(∩_∩)O谢谢
7 楼 sarin 2011-08-09  
Lorraine 写道
配置呢?不会……

基于您的项目配置即可,这里仅仅是对第三方类库的使用做出说明
6 楼 Lorraine 2011-08-09  
配置呢?不会……
5 楼 sarin 2011-03-14  
weir2009 写道
return null;
能得到报表么?

有输出流就可以了,这里我没有使用jasper的插件,不需要找视图组件。
4 楼 weir2009 2011-03-14  
return null;
能得到报表么?
3 楼 sarin 2011-01-18  
stormtoy 写道
不错,很详细,不过如果直接用编译好的文件,效率是不是会更好?

嗯,如果是xml只是在第一次请求时编译,后面就使用编译好的的了。
2 楼 stormtoy 2011-01-18  
不错,很详细,不过如果直接用编译好的文件,效率是不是会更好?
1 楼 niweiwei 2011-01-11  
写的不错,多向你学习......

相关推荐

    Struts2 + JasperReport应用一:导PDF,Excel,HTML显示

    总结起来,这篇博文会介绍如何在Struts2中集成JasperReport,通过编写Action类和配置Struts2的XML文件,实现动态报表的生成,并导出为PDF、Excel和HTML格式。这样的功能对于需要展示大量数据的应用场景非常有用,如...

    Struts2+JasperReport报表应用

    在填充数据之后,JasperReport会生成最终的报表文件,这可能是一个PDF、HTML、Excel或其他格式的文件,然后可以通过Struts2的返回值机制重定向到一个展示报表的页面。为了在Web应用程序中呈现报表,通常需要将生成的...

    struts2+Ireport+Jasperreport实现报表导出

    Struts2、iReport与JasperReport是Java开发中用于构建高效、动态Web应用程序和报表生成的工具。在这个项目中,这些技术结合在一起,提供了一种强大的报表导出解决方案。以下是对这些关键技术及其在项目中的应用的...

    jasperReport+ireport制作pdf报表教程

    **jasperReport+iReport制作PDF报表步骤** 1. **安装iReport**:首先需要下载并安装iReport工具,设置好JDK环境。 2. **创建数据源**:在iReport中配置数据源,如数据库连接,确保报表能够获取到数据。 3. **设计...

    Struts2与Jasperreport报表结合

    Struts2作为MVC(模型-视图-控制器)架构的一部分,主要用于处理HTTP请求并管理应用程序流程,而JasperReport则是一个强大的报告生成工具,能够创建复杂的报表设计,并以各种格式如PDF、HTML、Excel等导出。...

    struts2整合jasperreport

    Struts2是一个流行的Java Web应用程序框架,它提供了MVC(模型-视图-控制器)架构,而JasperReport则是一个强大的报表生成库,可以生成多种格式的报表,如PDF、HTML、Excel等。iReport是JasperReport的可视化设计...

    struts2利用jasperreport导出excel

    总之,Struts2结合JasperReport能够提供一种高效且灵活的方式,帮助开发者生成和导出Excel报表。通过精心设计的报表模板和合理的数据处理,我们可以为用户提供高质量的数据导出功能。在实际项目中,还可以根据需求...

    java报表(jasperreport_ireport+struts2)

    Struts2的拦截器和插件机制使其能够灵活地集成其他组件,如JasperReport,实现动态报表的生成。 集成JasperReport和iReport到Struts2的过程大致如下: 1. **安装和配置**:首先,需要在项目中引入JasperReport和...

    maven struts2 jasperreport ireport亲测通过整合多家资源

    4. **生成报表**: 在Struts2的Action中编写代码,执行查询并填充JasperReport的数据源,然后调用JasperReport API生成报表。 5. **展示报表**: 将生成的报表以流的形式返回给前端,可以嵌入到Web页面中,或者让用户...

    整合Struts2+JasperReport Web报表应用示例

    这个示例虽然简单,但它展示了如何在 Struts2 中使用 JasperReport 实现 Web 报表的基本流程。在实际项目中,你可能需要处理更复杂的数据源,如数据库查询结果,或者更复杂的报表交互。理解这个基础示例,有助于你更...

    整合Struts2.1+jasperreport

    6. 页面集成:在Struts2的视图层,通常是一个JSP页面,可以通过Struts2的标签库来调用Action并展示报表。例如,使用标签显示报表内容,或者使用标签执行Action并重定向到报表页面。 总的来说,"整合Struts2.1+...

    jasperReport+struts2+jatoolsPrinter打印

    总的来说,这个项目组合使用了jasperReport生成报表,Struts2处理Web请求,以及jatoolsPrinter进行打印,展示了Java企业级应用中一个完整的报表生成和打印流程。开发者需要熟悉这些库的使用,以及如何在Struts2框架...

    MyEclipse iReport JasperReport Struts2.doc

    本文将介绍如何在MyEclipse中使用iReport和JasperReport结合Struts2框架来开发报表。MyEclipse是一款强大的Java集成开发环境,而iReport是一款基于JasperReport的报表设计工具,Struts2则是一个流行的Java web应用...

    Struts2_JasperReport整合的例子

    Struts2是一个强大的MVC框架,用于构建动态、数据驱动的Web应用程序,而JasperReport则是一个开源的报表工具,可以生成丰富的报表,支持多种输出格式如PDF、HTML、Excel等。下面我们将深入探讨这两者如何整合以及...

    Struts2与jasperReport简单示例

    将Struts2与JasperReport结合,可以实现Web应用中的动态报表生成和展示。 首先,我们需要理解Struts2的核心概念。Struts2框架基于拦截器模型,通过Action类处理用户请求,Action与视图(JSP)之间的交互由结果类型...

    MyEclipse Eclipse iReport JasperReport Struts2

    【MyEclipse、Eclipse、iReport、JasperReport与Struts2的整合】 在Java Web开发中,MyEclipse和Eclipse是两种常用的集成开发环境(IDE),它们提供了丰富的功能,包括代码编辑、调试、构建和部署等。iReport是一款...

    Struts2整合JasperReport所需要的jar包

    整合Struts2和JasperReport可以使Web应用具备强大的报表功能,但同时也需要注意管理和优化好相关的资源,以提供流畅的用户体验。在实际开发中,根据具体需求选择合适的技术栈和最佳实践,能有效地提高项目质量和开发...

Global site tag (gtag.js) - Google Analytics