您的位置:首页 > 编程语言 > ASP

jasper在JSP中导出pdf和xls

2014-01-26 18:41 411 查看
环境配置

1 正确安装配置java的jdk

2 将ireport放到c:/ireport

3 将ant放到c:/ant(我用的是bea的ant路径是D:/bea/weblogic81/server/ant)

4 将jasperreports-1.2.0.jar 放置到当前classpath中(没有加,我使用的Ireport/lib下已经存在了)

5 将itext-1.3.1.jar放置到c:/ireport/lib(没有加,我使用的Ireport/lib下已经存在了)

6 修改ireport/ireport.bat文件,加入以下内容

set JAVA_HOME=C:/j2sdk1.4.2

set ANT_HOME=D:/bea/weblogic81/server/

set IREPORT_HOME=c:/ireport rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport

我修改的是:

set JAVA_HOME=C:/j2sdk1.4.2

set ANT_HOME=D:/bea/weblogic81/server/

set IREPORT_HOME=F:/backup/iReport-1.2.0 rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport

(不过对以上修改,感觉没有什么用处)

7 提供一个正常提供服务的数据库

现在高版本的ireport是不需要进行配置,可以直接使用的.

了解制作报表用的包

1 jasperreports-1.0.1.jar jasperreports是iReport的核心内容,jsperreport是一个报表制作程序,用它的规则制定一个xml文件,然后编译生成一个.jsper文件,这个.jsper文件是我们真正使用的,它很象.jsp文件,使用的是它编译后的servlet.
(http://jasperreports.sourceforge.net/)

2 itext-1.3.1.jar iText是一个开放源码的Java类库,是用来生成PDF文件的。如果要在生成的pdf文件显示中文等亚洲字符,还必须下载itext的亚洲字符包iTextAsian.jar (http://itextdocs.lowagie.com/downloads/iTextAsian.jar)

3 jfreechart-1.0.0-rc1.jar jfreechart是一款免费的、功能强大的统计图生成工具,可以直接生成PNG,JPG等各式的文件。 (http://www.jfree.org/jfreechart/)

4 jcommon-1.0.0-rc1.jar JCommon是一组有用的classes集合.它已经用在JFreeChart,JFreeReport与其它项目上.
这个类库包含了以下功能: 文本工具类(text utilities), 用来显示关于应用程序信息的用户界面类, 布局定制管理器, 一个日期选择面板, 序列化工具类, XML解析器支持类. (http://www.jfree.org/jcommon/)

5 poi-2.0-final-20040126.jar Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。直接调用poi包的不是ireport,而是jasperreport。
(http://www.apache.org/dyn/closer.cgi/jakarta/poi/)

使用介绍

1 启动:点击ireport/ireport.bat启动

2 修改语言环境:tools-option-general中language中更改-apply

3 创建报表 file-new document 输入名字-ok Portrait是纵向,Landscape是横向。

4 连接数据源 datasource-connection/datasource-new-connections porperties- 输入名字-选择jdbc Driver,jdbc url-输入username和password,-test测试通过表明数据源连接正确-save保存 (注意:必须保证数据库驱动在lib目录下)

5 基本域说明

title域用来放报表的总标题

pageHeaher域顾名思义页头

columnHeader域是用来放static text的,也就是不循环的部分。

detail域是用来放text field的,也就是循环部分。

pageFooter域是用来放本页的统计参数的。

summary域是用来放整个表的统计参数的。

可以直接调整每个域的长度,也可以通过Band properties来调整 (在我的项目中,只设置的title和detail,在title中显示报表的总标题和所有parameters字段,在detail中显示需要循环的列表字段)

6 在报表中添加字段static text edit-insert element -static text 鼠标拖拉添加在页面中双击或者右键properties在static text Tab 中输入字段名字,如果显示有乱码,font-font name中选择"中文GB2312" border 中可以设置表格边线样式

7 在报表中添加字段text field edit-insert element -text field 鼠标拖拉添加在页面中双击或者右键properties在text field 中输入字段名字, 样式如同$F{text_field_name},

f表示为field变量,是数据库中抽取出来的,你想在报表中显示的数据库内容,

p为parameter参数,是应用需要提供给报表的入口,比如想在报表被解释的时候提供where语句的条件值, 就可以用$P(parameterName)比如:
select * from bugs where proname=$P{projectName} order by proname,modulename

v为变量(显示字体颜色为绿色,表示格式正确) border 中可以设置表格边线样式

8 调整报表布局鼠标拖动各个字段,拼接想要的报表布局,如果鼠标点击字段, 显示为红色,说明该字段跨越了两个域显示为绿色,说明两个字段叠加显示为蓝色,说明该字段位置正确

9 报表添加SQL查询语句 资料来源->报表查询(datasource-report query) 在Report SQL query里填写SQl语句。如果语句正确,在下面的field里就会显示正常的表字段。 (可以从显示的所有字段中选取想用做field的字段,点击ok后,自动添加为field动态字段)

10 为报表添加动态字段预览->报表字段(view-Fields) 新建一个字段,字段名字必须和报表中Fields中添加名字一直,同时必须是sql结果集中存在的. (把fields里的字段直接拖到报表上也行)

11 为SQL语句添加参数 预览->报表参数(view-parameters) 在parameters里新增一个参数 paratemeter name 是参数名,在SQL语句里写成"$P{参数名}" paratemeter class type里选择参数类型。 注意:如果是int型的数据,最好在报表字段里将该字段的Class type改成java.lang.String型的。
另外一种办法,不管该字段原来是什么数据类型,直接在paratemeter class type里选择java.lang.String类型, 后在Default value expression 填写"Integer.toString(整数)"。

12 添加报表变量 预览->报表变量 $V{变量名}(没有用到过!)

13 处理字体 选中字段->右键->properties->font(双击也可以) Report font 选择全局的字体(仅限于该报表) Font name 选择在ireport里面显示的字体 Pdf font name 选择在pdf里面显示的字体 Rotation 选择内容是否旋转(很有用的选项) PDF Encoding 中文要用UniGB-UCS2-H,外部字体要选Identity-H

14 设定该报表的全局字体 预览->报表字型(view-font)

15 编译jrxml 建立->编译 (build-compile) 编译后生成一个后缀名为jasper的binary文件,可以直接给程序调用。

web项目应用

1 jsp输出PDF报表

需要放到项目里的包 itext-1.3.1.jar iTextAsian.jar jasperreports-1.0.1.jar jsp

输出PDF的例子

{

<%@ page import="java.sql.*" %>

<%@ page import="java.util.*" %>

<%@ page import="java.io.*" %>

<%@ page import="net.sf.jasperreports.engine.JasperFillManager"%>

<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>

<%@ page import="net.sf.jasperreports.engine.JRException"%>

<%@ page import="net.sf.jasperreports.engine.JasperRunManager"%>

<%

String rowid = "1";//初始化变量

Connection conn= DriverManager.getConnection("proxool.test");//从数据源连接数据库

//装载jasper文件application

File exe_rpt = new File(application.getRealPath("/reports/test.jasper"));

//rowid就是iReport的变量$P{rowid}的名称

Map parameters = new HashMap();

parameters.put("rowid",rowid);

try{

// fill

JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);

// 生成pdf

byte[] bytes = JasperRunManager.runReportToPdf(exe_rpt.getPath(),parameters,conn);

response.setContentType("application/pdf");

response.setContentLength(bytes.length);

ServletOutputStream ouputStream = response.getOutputStream();

ouputStream.write(bytes,0,bytes.length);

ouputStream.flush();

ouputStream.close();

conn.close();

}catch(JRException ex){

out.print("Jasper Output Error:"+ex.getMessage());

}

%>

}

jsp输出EXCEL报表

需要放到项目里的包 jasperreports-1.0.1.jar poi-2.0-final-20040126.jar

输出excel要注意的:

(1) 输出excel报表必须fields的边界刚好填充满整个页面,不然会有大量的空白出现。

(2) 删除记录最下面的空行需要加上参数 exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);

(3) 删除多余的ColumnHeader需要加上参数 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);

(4) 在ireport里给fields加上border,那输出的excel就会有很黑的边框,跟excel默认的灰度边框就会很不协调。但是如果不加border,在输出的excel里就不会显示每个表格的边框。

解决方法是:
第一步 在选中字段->右键->properties->Common->Transparent 打上勾。 第二步 在输出的jsp页面加上参数 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);

2 jsp输出EXCEL的例子

{

<%@ page import="java.sql.*" %>

<%@ page import="java.util.*" %>

<%@ page import="java.io.*" %>

<%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>

<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>

<%@ page import="net.sf.jasperreports.engine.JRException"%>

<%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel

<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel

<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel

<%

String rowid = "1";

Connection conn= DriverManager.getConnection("proxool.test");

//装载jasper文件application

File exe_rpt = new File(application.getRealPath("/excel/test_excel.jasper"));

//rowid就是iReport的变量$P{rowid}的名称

Map parameters = new HashMap();

parameters.put("rowid",rowid);

try{

// fill

JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);

// excel输出

ByteArrayOutputStream oStream = new ByteArrayOutputStream();

JRXlsExporter exporter = new JRXlsExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);

exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 删除记录最下面的空行

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 删除多余的ColumnHeader

exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 显示边框

exporter.exportReport();

byte[] bytes = oStream.toByteArray();

if(bytes != null && bytes.length > 0) {

response.reset();

response.setContentType("application/vnd.ms-excel");

response.setContentLength(bytes.length);

ServletOutputStream ouputStream = response.getOutputStream();

ouputStream.write(bytes,0,bytes.length);

ouputStream.flush();

ouputStream.close();

}else{

out.print("bytes were null!");

}

conn.close();

}catch(JRException ex){

out.print("Jasper Output Error:"+ex.getMessage());

}

%>

}

总结 ireport可以显示图表,饼图,曲线图等,也可以显示符合报表

JasperReports介绍:

使用JasperReports生成报表是非常简单的,仅仅使用net.sf.jasperreports.engine包中的几个类即可完成报表的生成、预览、打印、导出等各个功能。

1. net.sf.jasperreports.engine.JasperCompileManager类。

使用这个类的几个静态方法即可完成对报表的编译工作(具体参见api文档)

编译完成后可以JasperCompileManager有两种处理方式:

1> 返回一个JasperReport对象

2> 在.jrxml文件所在的目录生成一个.jasper文件

这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件,毕竟报表的结构不是每天都在改动,所以每次重新编译报表并不是很划算。

2. net.sf.jasperreports.engine.JasperFillManager类

这个类的作用是用数据填充报表。它可以使用JasperReport对象也可以使用。jasper文件做为报表模板。

它同样有2中处理方式:

1> 返回一个JsaperPrint对象。

2> 在.jasper文件所在目录生成一个.jrprint文件

这个类使用net.sf.jasperreports.engine.JRDataSource接口的实现做为数据源。任何实现了JRDataSource的类均可做为数据源使用

在net.sf.jasperreports.engine.data包中定义了一些数据源,可根据自己的需要选择。这里我使用的是JRTableModelDataSource做为

数据源(因为我的报表还要显示在Table中)。

3. net.sf.jasperreports.engine.JasperPrintManager和net.sf.jasperreports.engine.JasperExportManager

者两个类的作用是打印、导出报表

他们使用 JasperPrint 和 .jrprint文件做为输入。

可以根据自己的需要使用里面的方法。

例:

import net.sf.jasperreports.engine.*;

import net.sf.jasperreports.view.*;

public class CompileReport {

public static void main(String args[]) {

try {

//编译report.jrxml并在report.jrxml所在的目录中生成report.jasper文件

JasperCompileManager.compileReportToFile("report.jrxml");

//填充数据,这里使用的是JREmptyDataSource

JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));

//预览报表,false代表不是使用xml文件。

JasperViewer view = new JasperViewer("reports.jrprint", false);

view.pack();

view.setVisible(true);

}

catch (Exception e) {

e.printStackTrace()

}

}

}

http://www.heci.net 贺词网!]

JasperReports学习笔记

版本:jasperreports-0.6.7

学习资料来源:http://jasperreports.sourceforge.net

一、 需求(requirements)

JasperReports要用到的工具和类

1. JDK(java开发环境)

JDK 1.2.2 or higher

2. XML

JAXP 1.1 XML Parser(XML解析器)

Jakarta Commons Digester Component (version 1.1 or later)

http://jakarta.apache.org/commons/digester/

Jakarta Commons BeanUtils Component (version 1.1 or later)

http://jakarta.apache.org/commons/beanutils/

Jakarta Commons Collections Component (version 1.0 or later)

http://jakarta.apache.org/commons/collections/

Jakarta Commons Logging Component (version 1.0 or later)

http://jakarta.apache.org/commons/logging/

3. JDBC(连接数据库用)

JDBC 2.0 Driver

4. PDF(转换为PDF文件用到)

iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares

(version 1.01 or later)

http://www.lowagie.com/iText/

5. XLS(转换为excel文件用)

Jakarta POI (version 2.0 or later)

http://jakarta.apache.org/poi/

二、快速了解(quick how to)

1. Main classes(主要的类)

用JasperReports 时,用到的主要类

net.sf.jasperreports.engine.JasperCompileManager

net.sf.jasperreports.engine.JasperFillManager

net.sf.jasperreports.engine.JasperPrintManager

net.sf.jasperreports.engine.JasperExportManager

这些类提供了很多静态方法,用来编译、填充、打印和导出报表。详细信息请参考JasperReports的javadoc文档。

net.sf.jasperreports.view.JasperViewer

此类用来预览生成的报表(generated reports.)。

net.sf.jasperreports.view.JasperDesignViewer

此类用来预览报表设计(view
the report design)。

2. 编译报表设计Compiling a report design

xml文件定义报表设计(report design)。编译报表设计(report design)产生报表(generate reports)。网页http://jasperreports.sourceforge.net/quick.how.to.html中介绍用net.sf.jasperreports.engine.JasperCompileManager类的静态方法compileReportXXX()来编译报表设计(report
design)。但是JasperCompileManager不赞成使用此方法编译报表设计(report design),推荐使用JasperCompileManager的方法compileReportXXX()来代替。

编译报表设计(report design)时,jasperreports engine首先检查模板,确定是否一致,然后转换所有的报表表达式(report expressions),最后产生.jasper文件。 要想使编译工作尽可能灵活,你可以实现接口net.sf.jasperreports.engine.design.JRCompiler。

3.预览报表设计 Viewing a report design

使用net.sf.jasperreports.view.JasperDesignViewer的程序来预览。他的main()方法接受报表设计文件名(xml)或者编译后的.jasper文件。

4. 填充报表 Filling a report

编译报表设计(xml文件)得到报表文件(.jasper),再调用net.sf.jasperreports.engine.JasperFillManager类的方法fillReportXXX(),可以得到报表(JasperPrint)。

5. 预览报表 Viewing a report

Generated reports can be viewed using the net.sf.jasperreports.view.JasperViewer application.

In its main() method, it receives the name of the file which contains the report to view.

我没有测试成功。

6. Printing a report

Generated reports can be printed using the printReport(), printPage() or printPages() static methods exposed by the net.sf.jasperreports.engine.JasperPrintManager class.

7. Exporting to PDF, HTML, XLS, CSV or XML format

填充报表文件(.jasper文件)得到报表(JasperPrint)后,可以使用net.sf.jasperreports.engine.JasperExportManager类的方法exportReportXXX()导出为各种格式的文件PDF,HTML,XML。

After having filled a report, we can also export it in PDF, HTML or XML format using the exportReportXXX() methods of the net.sf.jasperreports.engine.JasperExportManager
class.

三、JasperReports的工作流程:

根据上图的流程,JasperReports做报表有一下步骤:

1、 报表设计,可以用ireport可视化工具来实现,生成xml文件。完成后,可以直接到步骤3,直接编译xml文件。

2、 如果已经存在报表设计文件(xml文件),可以用net.sf.jasperreports.engine.xml.JRXmlLoader.load()方法载入报表设计,该方法返回JasperDesign对象,通过JasperDesign对象,可以修改报表设计,比如:添加、删除字段,添加、删除变量,添加、删除分组,等等。

3、 完成报表设计后,接下来就可以编译报设计,编译报表设计可以用类net.sf.jasperreports.engine.JasperCompileManager的compileReport()方法来实现,该方法可以编译xml文件或JasperDesign对象,产生JasperReport对象,JasperReport对象可序列化,能够保存为文件(通常是.jasper文件)。类net.sf.jasperreports.engine.JasperCompileManager还可以把报表转化为报表设计文件(xml文件)。得到JasperReport对象(可从.jasper文件实例化一个JasperReport对象)后,给报表填充数据产生JasperPrint对象。JasperPrint对象可序列化,保存为文件。有了JasperPrint对象后,可以打印、浏览、转换为其他格式的文件,如:PDF,HTML,XML,XLS,CSV等等,这些操作就是我们想得到的最终结果。尽管JasperPrintManager类可以导出为PDF,XML文件,但是不赞成使用JasperPrintManager类来导出,建议用JasperExportManager类来导出PDF,HTML,XML文件;要导出XLS和CSV文件,用专业的导出类net.sf.jasperreports.engine.export.JRXlsExporter类和net.sf.jasperreports.engine.export.JRCsvExporter类

导出为XLS的代码段:

JRXlsExporter exporter = new JRXlsExporter();//创建实例

//设计参数

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, strDestFile);

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);

exporter.exportReport();//导出

导出为CSV文件和XLS类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: