天天看点

jasper在JSP中导出pdf和xls

环境配置

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 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.

4 jcommon-1.0.0-rc1.jar JCommon是一组有用的classes集合.它已经用在JFreeChart,JFreeReport与其它项目上. 这个类库包含了以下功能: 文本工具类(text utilities),

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

使用介绍

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="net.sf.jasperreports.engine.JasperFillManager" %>

<%@ 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");

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

   // 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!");

   }

总结 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()

          }

       }

JasperReports学习笔记

版本:jasperreports-0.6.7

一、    需求(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)

  Jakarta Commons BeanUtils Component (version 1.1 or later)

  Jakarta Commons Collections Component (version 1.0 or later)

  Jakarta Commons Logging Component (version 1.0 or later)

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)

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

  Jakarta POI (version 2.0 or later)

二、快速了解(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

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类似。

下一篇: shell破冰