jasper在JSP中导出pdf和xls

  1. 云栖社区>
  2. 博客>
  3. 正文

jasper在JSP中导出pdf和xls

小步2013 2008-10-27 09:55:00 浏览1013
展开阅读全文
环境配置

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

网友评论

登录后评论
0/500
评论