Struts2中整合JasperReports 上

Struts2提供了很好的JasperReports支持.

1,JasperReports简介

在企业级应用的开发中,必须面对大量报表的问题,在传统开发过程中,我们总是使用HTML页面生成报表,在这种方式下,开发人员需要花费大量时间来设计HTML报表,而且不支持导出多种格式的报表文件.JasperReports项目是一个强大,灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML或者XML格式,而且它是开源免费的,是全部由Java语言写成的.JasperReports由一份XML格式的报表设计文件开始,经过编译,填充,导出或预览,可以产生多种格式的报表文件,而底层的实现细节完全透明,开发者只需提供一份XML格式的报表设计文件,借助于JasperReports项目,即可生成多种格式的报表文件.此外,它还提供一个iReport的开发工具,它能以所见即所得的方式来开发报表定义文件,大大简化了JasperReports报表的开发.

1.1,下载和安装JasperReports

使用JasperReports框架来开发报表,即使要开发出各种文件格式的报表,也可以只定义一个报表源文件,使用JasperReports开发报表的核心工作就是编辑一个报表设计文件.报表设计文件是一个XML文件,可以使用手工方式来编辑该文件,但我们一般使用iReport工具来设计.

下载和安装JasperReports的步骤如下:
1,在JasperReports官网http://jasperforge.org/plugins/project/project_home.php?group_id=102上下载jasperreports-3.0.0-project.zip文件,
2,JasperReports的JAR文件是dist/jasperreports-3.0.0.jar文件.将它复制到Web应用的WEB-INF\lib路径下.
3,JasperReports框架生成其他格式的文档可能还依赖于另外的一些开源项目,例如生成PDF文档依赖于iText项目(itext-1.3.1.jar),生成EXCEL文件依赖为POI项目(poi-3.0.1-FINAL-20070705.jar).因此,推荐将lib路径下所有的JAR文件都复制到Web应用的WEB-INF\lib路径下.

1.2,JasperReports静态报表的开发

下面是一个静态报表的例子.

开发报表必须定义一个报表设计文件,也就是一个XML文件,它的文件后缀名为.jrxml,这里直接给出源代码static.jrxml:
<?xml version="1.0" encoding="GB2312"?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="static" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535"
   columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false"
   isSummaryNewPage="false">
<property name="ireport.scriptlethandling" value="0" />
<property name="ireport.encoding" value="GB2312" />
<import value="java.util.*" />
<import value="net.sf.jasperreports.engine.*" />
<import value="net.sf.jasperreports.engine.data.*" />

   <background>
    <band height="0" isSplitAllowed="true" >
    </band>
   </background>
   <title>
    <band height="50" isSplitAllowed="true" >
    </band>
   </title>
   <pageHeader>
    <band height="50" isSplitAllowed="true" >
    </band>
   </pageHeader>
   <columnHeader>
    <band height="53" isSplitAllowed="true" >
     <staticText>
      <reportElement x="44" y="20" width="165" height="22" key="staticText-2"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font pdfFontName="STSong-Light" size="14" isBold="true" pdfEncoding ="UniGB-UCS2-H"/>
      </textElement>
     <text><![CDATA[图书:]]></text>
     </staticText>
    </band>
   </columnHeader>
   <detail>
    <band height="100" isSplitAllowed="true" >
     <staticText>
      <reportElement x="44" y="0" width="301" height="100" forecolor="#0000CC" key="staticText-1"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font fontName="幼圆" pdfFontName="STSong-Light" size="24" isPdfEmbedded ="true" pdfEncoding ="UniGB-UCS2-H"/>
      </textElement>
     <text><![CDATA[Spring2.0J2EEAjax]]></text>
     </staticText>
    </band>
   </detail>
   <columnFooter>
    <band height="30" isSplitAllowed="true" >
    </band>
   </columnFooter>
   <pageFooter>
    <band height="50" isSplitAllowed="true" >
    </band>
   </pageFooter>
   <lastPageFooter>
    <band height="50" isSplitAllowed="true" >
    </band>
   </lastPageFooter>
   <summary>
    <band height="50" isSplitAllowed="true" >
    </band>
   </summary>
</jasperReport>
上面的这个报表文件可以由iReport工具生成,不必手工填写.
有了这件报表文件后,必须先将其编译成报表文件,编译报表用JasperReports项目的JasperCompileManager类,下面是使用它的例子:
package lee;
import net.sf.jasperreports.engine.*;
public class MyCompile
{
    public static void main(String[] args) throws Exception
    {
   //编译static.jrxml报表设计文件,生成一个static.jasper报表文件
   JasperCompileManager.compileReportToFile("static.jrxml" , "static.jasper");
   System.out.println("成功编译成JasperReport文件(*.jasper)");
   System.exit(0);
    }
}
该Java程序根据static.jrxml文件编译生成static.jasper文件,这个文件依然不能成为报表,还需要为该报表填充数据,填充报表时就可以填充报表所需的数据源,参数等内容,而报表就负责显示根据数据源查询的结果,参数等,

填充报表使用JasperFillManager类完成,该类填充一个jasper报表文件,填充后生成一个jsprint文件,使用它的例子如下:
package lee;
import net.sf.jasperreports.engine.*;
public class MyFill
{
    public static void main(String[] args) throws Exception
    {
   //填充时,即使没有使用数据源,也必须指定一个新建的JREmptyDataSource实例,而不能直接使用null
   JasperFillManager.fillReportToFile("static.jasper" , null , new JREmptyDataSource());
   System.out.println("成功填充了一个报表文件(*.jrprint)");
   System.exit(0);
    }
}
该Java程序将填充static.jasper报表文件,生成一个static.jrprint文件,这个文件已经是一个可以显示的报表了,这份报表是格式无关的,它即可以生成PDF格式的报表,也可以生成EXCEL格式的报表,还可以直接使用JasperReports的报表浏览工具来浏览.

下面的程序会生成一个窗口,并在窗口中使用JasperReports的报表浏览工具来浏览报表,JasperReports用于浏览报表的类是JRViewer,它继承自javax.swing.JPanel,因此使用非常方便.代码如下:
package lee;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
import javax.swing.JFrame;
import java.awt.*;
public class MyJRViewer
{
    public static void main(String[] args) throws Exception
    {
   //以指定的*.jrprint文件创建一个JRViewer实例
   JRViewer jr = new JRViewer("static.jrprint" , false);
   //创建一个主窗口
   JFrame jf = new JFrame("报表预览");
   jf.add(jr);
   jf.pack();
   jf.setVisible(true);
    }
}
运行该程序,就可以看到面板里面的报表内容.这个面板上有打印按钮,用户如果单击该按钮就可以实现报表打印功能.

将JasperPring导出成EXCEL文档的Java代码如下:
package lee;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.util.*;
public class MyExportExcel
{
    public static void main(String[] args) throws Exception
    {
   //使用JRLoader来加载一个*.jrprint文件,生成一个JasperPrint实例
   JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject("static.jrprint");
   //创建一个JRXlsExporter实例,用于导出EXCEL文档
   JRXlsExporter exporter = new JRXlsExporter();
   //设置要导出的jasperPrint实例
   exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
   //设置要导出的目标文件
   exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "static.xls");
   //设置每张报表都写在不同的文件里
   exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
   exporter.exportReport();
   System.out.println("成功创建了一个XML文档");
   System.exit(0);
    }
}
执行上面的代码,可以生成一个名为static.xls的文件.

JasperReports提供了如下文件导出器:
1,JRXlsExporter:用于将JasperPrint导出成Excel文件(.xls);
2,JRCsvExporter:用于将JasperPrint导出成CSV文件;
3,JRHtmlExporter:用于将JasperPrint导出成HTML文件;
4,JRPdfExporter:用于将JasperPrint导出成PDF文件;
5,JRRtfExporter:用于将JasperPrint导出成RTF文件;
6,JRTextExporter:用于将JasperPrint导出成普通文本文件;
7,JRXmlExporter:用于将JasperPrint导出成XML文件;

此外,JasperReports还提供了一个导出管理器:JasperExportManager,这个导出管理器提供了多个静态方法,可以直接导出多种文件格式的报表,例如:
1,exportReportToHtmlFile:导出成一个HTML报表文件;
2,exportReportToPdfFile:导出成一个PDF报表文件;
3,exportReportToPdfStream:导出成一个PDF报表文件,并将该报表文件输出到一个指定的输出流里;
4,exportReportToXmlFile:导出成一个XML报表文件;
5,exportReportToXmlFile:导出成一个XML报表文件,并将该报表文件输出到一个指定的输出流里;
下面是使用它的一个例子:
package lee;
import net.sf.jasperreports.engine.*;
public class MyExportPdf
{
    public static void main(String[] args) throws Exception
    {
   //使用JasperExportManager,将一个.jrprint导出成PDF文档
   JasperExportManager.exportReportToPdfFile("static.jrprint" , "static.pdf");
   System.out.println("成功创建了一个PDF文档");
   System.exit(0);
    }
}

此外,还有一个JasperRunManager类,它可以直接将一个JasperReport实例.jasper文件导出成报表文件,它提供了如下几个方法:
1,runReportToHtmlFile:直接将一个JasperReport导出成HTML格式的报表文件;
1,runReportToPdfFile:直接将一个JasperReport导出成PDF格式的报表文件;
1,runReportToPdfFileStream:直接将一个JasperReport导出成PDF格式的报表文件,并将该报表文件输出到一个指定的输出流里;

1.3,JasperReports的开发流程

经过上面的几步,可以看出JasperReports的开发流程如下:
1,开发报表设计文件(.jrxml文件),这里可以使用iReport工具来编写;
2,使用JasperCompileManager工具编译.jrxml文件,生成.jasper文件;
3,使用JasperFillManager工具填充编译后的.jasper文件,填充后生成.jrprint文件;
4,使用导出管理器JasperExportManager或各种格式的文件导出器(JRXxxExporter)将.jrprint文件导出成各种格式的报表文件,也可以使用JRViewer来直接浏览报表.

上面的开发中主要用到如下几个类:
1,JasperCompileManager:将.jrxml文件编译成.jasper文件;
2,JasperFillManager:填充报表,给报表的数据查询提供数据库连接,给参数设值等;填充后生成.jrprint文件,这是一份可以显示或导出打印的报表文件;
3,JasperPrintManager:用于将一个.jrprint文件完成打印;
4,JasperExportManager:用于将一个.jrprint文件导出成PDF,XML等格式的文件;
5,JasperRunManager:用于将一个.jasper文件导出成各种格式的报表文件,主要是PDF,HTML等;
6,JRXxxExporter:用于将.jrprint文件导出成对应格式的报表文件.

在这个过程中不同类型的文件也有专门的类来对应:
1,JasperDesign:对应.jrxml文件;
2,JasperReport:对应.jasper文件;
3,JasperPrint:对应.jrprint文件;

1.4,解决PDF报表的中文问题

由于iText默认不支持输出中文字符,因此我们必需增加iText的亚洲字符支持,可以到iText官方网站http://www.lowagie.com/iText/上下载一个iTextAsian.jar,并将它复制到Web应用的WEB-INF\lib路径下,此外还必需在有中文字符的地方设置中文字符所使用的PDF编码,以及PDF字体,如果这两个参数设置不正确,或者没有设置,都不会得到正常的包含中文的PDF报表.
为了设置中文字符的PDF字体及PDF编码,要在.jrxml文件内容前增加如下元素:
<!-- 设置中文编码 -->
<textElement>
<!-- 设置文本内容所使用的字体格式,以及所使用的PDF编码和PDF字体 -->
<font pdfFontName="STSong-Light" size="14" isBold="true" pdfEncoding ="UniGB-UCS2-H"/>
</textElement>

这样就可以在PDF文件中显示中文了,设置文本的格式一般用style的方式来设置,以方便复用.

2,动态报表

2.1,带参数的报表

JasperReports允许在设计报表时使用一个或多个参数,这些参数在填充报表时通过一个Map对象传入.为了在设计报表时定义参数,应该在报表设计文件中使用<parameter ../>元素,每个<parameter ../>元素定义一个参数,定义参数所用的格式如下:
<parameter name="book3" isForPrompting="false" class="java.lang.String" />
定义了该参数之后,就可以在指定报表设计文件的任意地方输出该参数,输出参数使用如下语法格式:$P{book3}

下面是例子的报表设计文件代码:
<?xml version="1.0" encoding="GBK" ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="simpleVariable" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535"
   columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false"
   isSummaryNewPage="false">
<property name="ireport.scriptlethandling" value="0" />
<property name="ireport.encoding" value="GBK" />
<import value="java.util.*" />
<import value="net.sf.jasperreports.engine.*" />
<import value="net.sf.jasperreports.engine.data.*" />

<style name="zh" isDefault="false" fontName="隶书" fontSize="18" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" />
<parameter name="author" isForPrompting="true" class="java.lang.String"/>
<parameter name="book1" isForPrompting="false" class="java.lang.String"/>
<parameter name="book2" isForPrompting="false" class="java.lang.String"/>
<parameter name="book3" isForPrompting="false" class="java.lang.String"/>
   <background>
    <band height="0" isSplitAllowed="true" >
    </band>
   </background>
   <title>
    <band height="50" isSplitAllowed="true" >
    </band>
   </title>
   <pageHeader>
    <band height="50" isSplitAllowed="true" >
    </band>
   </pageHeader>
   <columnHeader>
    <band height="39" isSplitAllowed="true" >
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="203" y="8" width="131" height="27" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.String"><![CDATA[$P{author}]]></textFieldExpression>
     </textField>
     <staticText>
      <reportElement style="zh" x="137" y="8" width="56" height="27" key="staticText-1"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <text><![CDATA[作者:]]></text>
     </staticText>
    </band>
   </columnHeader>
   <detail>
    <band height="173" isSplitAllowed="true" >
     <rectangle radius="5" >
      <reportElement x="128" y="8" width="255" height="103" forecolor="#FFFFFF" backcolor="#99FFFF" key="rectangle-1"/>
      <graphicElement stretchType="NoStretch"/>
     </rectangle>
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" mode="Opaque" x="137" y="14" width="241" height="28" backcolor="#FFFFFF" key="textField"/>
      <box topBorder="None" topBorderColor="#FF9900" leftBorder="None" leftBorderColor="#990099" leftPadding="20" rightBorder="None" rightBorderColor="#FF0000" bottomBorder="None" bottomBorderColor="#99FFFF"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.String"><![CDATA[$P{book1}]]></textFieldExpression>
     </textField>
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="137" y="42" width="241" height="28" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.String"><![CDATA[$P{book2}]]></textFieldExpression>
     </textField>
     <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
      <reportElement style="zh" x="137" y="70" width="241" height="28" key="textField"/>
      <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
      <textElement>
       <font/>
      </textElement>
     <textFieldExpression   class="java.lang.String"><![CDATA[$P{book3}]]></textFieldExpression>
     </textField>
    </band>
   </detail>
   <columnFooter>
    <band height="30" isSplitAllowed="true" >
    </band>
   </columnFooter>
   <pageFooter>
    <band height="50" isSplitAllowed="true" >
    </band>
   </pageFooter>
   <lastPageFooter>
    <band height="50" isSplitAllowed="true" >
    </band>
   </lastPageFooter>
   <summary>
    <band height="50" isSplitAllowed="true" >
    </band>
   </summary>
</jasperReport>
在报表设计文件中,依次定义了4个参数,都是字符串类型,下面是填充报表所使用的程序:
package lee;
import net.sf.jasperreports.engine.*;
import java.util.*;
public class MyFill
{
    public static void main(String[] args) throws Exception
    {
   //创建一个Map对象负责为参数传值
   Map params = new HashMap();
   //为报表中的4个参数设值
   params.put("author" , "李");
   params.put("book1" , "Spring2.0");
   params.put("book2" , "J2EE");
   params.put("book3" , "Ajax");

   //填充时,即使没有使用数据源,也必须指定一个新建的JREmptyDataSource实例,而不能直接使用null
   JasperFillManager.fillReportToFile("simpleVariable.jasper" , params , new JREmptyDataSource());
   System.out.println("成功填充了一个报表文件(*.jrprint)");
   System.exit(0);
    }
}
这里直接使用了simpleVariable.jasper文件,将.jrxml文件编译成.jasper文件跟前面讲的一样,这里不再说明,经过填充之后生成了simpleVariable.jrprint文件,这时候可以看到,参数值已经存在于报表文件中了.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值