`
longgangbai
  • 浏览: 7340904 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】iReport+jasperReport之scriptlet

阅读更多

           转载自http://www.blogjava.net/bulktree/archive/2008/12/17/246786.html

             提起scriptlet就不能不联想到它的强大功能,jasperReport也是支持scriptlet的哦,先分析一下JasperReport的API吧!
在填充报表时scriplet是一个非常有力的工具,JRAbstractScriptlet.java位于net.sf.jasperreports.engine包下是一个抽象



beforeReportInit() ,afterReportInit() ,beforePageInit(),afterPageInit(), beforeColumnInit(), afterColumnInit() ,beforeGroupInit(String groupName),afterGroupInit(String groupName) 
看看这些名字就知道你能完成那些功能,这几个方法是要求我们实现的,jasperReport给我们提供了一个实现类JRDefaultScriptlet.java,默认的空实现了上面几个方法,它只是很便利的为我们提供了所需的八个方法的空实现。我们写自己的scriptlet时需要继承JRDefaultScriptlet.java这个类实现自己的相应的功能即可。
 先来看一个简单的例子:
先看看模板文件的处理:
新建时填写的这个类是下面我们要介绍的继承自JRDefaultScriptlet.java类,也就是在模板文件中我们要加上如下代码

scriptletClass="org.bulktree.ireport.scriptlet.ScriptletReportDemo"

完整的模板文件如下:scriptletDemo.jrxml

<?xml version="1.0" encoding="UTF-8"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
         
name="scriptletDemo"
         columnCount
="1"
         printOrder
="Vertical"
         orientation
="Portrait"
         pageWidth
="595"
         pageHeight
="842"
         columnWidth
="535"
         columnSpacing
="0"
         leftMargin
="30"
         rightMargin
="30"
         topMargin
="20"
         bottomMargin
="20"
         whenNoDataType
="NoPages"
         scriptletClass
="org.bulktree.ireport.scriptlet.ScriptletReportDemo"
         isTitleNewPage
="false"
         isSummaryNewPage
="false">
    
<property name="ireport.scriptlethandling" value="2" />
    
<property name="ireport.encoding" value="UTF-8" />
    
<import value="java.util.*" />
    
<import value="net.sf.jasperreports.engine.*" />
    
<import value="net.sf.jasperreports.engine.data.*" />

    
<parameter name="ReportTitle" isForPrompting="true" class="java.lang.String"/>

        
<background>
            
<band height="0"  isSplitAllowed="true" >
            
</band>
        
</background>
        
<title>
            
<band height="20"  isSplitAllowed="true" >
                
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
                    
<reportElement
                        
mode="Opaque"
                        x
="193"
                        y
="0"
                        width
="134"
                        height
="18"
                        backcolor
="#FFCC33"
                        key
="textField"/>
                    
<box></box>
                    
<textElement textAlignment="Center" verticalAlignment="Middle">
                        
<font pdfFontName="Helvetica-Bold" size="12" isBold="true"/>
                    
</textElement>
                
<textFieldExpression   class="java.lang.String"><![CDATA[$P{ReportTitle}]]></textFieldExpression>
                
</textField>
            
</band>
        
</title>
        
<pageHeader>
            
<band height="0"  isSplitAllowed="true" >
            
</band>
        
</pageHeader>
        
<columnHeader>
            
<band height="0"  isSplitAllowed="true" >
            
</band>
        
</columnHeader>
        
<detail>
            
<band height="264"  isSplitAllowed="true" >
                
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
                    
<reportElement
                        
x="85"
                        y
="20"
                        width
="329"
                        height
="61"
                        forecolor
="#FF0099"
                        key
="textField-1"/>
                    
<box></box>
                    
<textElement textAlignment="Center" verticalAlignment="Middle">
                        
<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/>
                    
</textElement>
                
<textFieldExpression   class="java.lang.String"><![CDATA[$P{REPORT_SCRIPTLET}.showInfor()]]></textFieldExpression>
                
</textField>
            
</band>
        
</detail>
        
<columnFooter>
            
<band height="0"  isSplitAllowed="true" >
            
</band>
        
</columnFooter>
        
<pageFooter>
            
<band height="0"  isSplitAllowed="true" >
            
</band>
        
</pageFooter>
        
<summary>
            
<band height="50"  isSplitAllowed="true" >
            
</band>
        
</summary>
</jasperReport>

下来看看怎么实现我们自己的scriplet

ScriptletReportDemo.java

package org.bulktree.ireport.scriptlet;

import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;

/**
 * 
 * 
@author bulktree Email: laoshulin@gmail.com
 * @Nov 26, 2008
 
*/

public class ScriptletReportDemo extends JRDefaultScriptlet {

    @Override
    
public void afterColumnInit() throws JRScriptletException {
        System.out.println(
"**************************************afterColumnInit()**************************************");
    }


    @Override
    
public void afterDetailEval() throws JRScriptletException {
        System.out.println(
"**************************************afterDetailEval()**************************************");
    }


    @Override
    
public void afterGroupInit(String groupName) throws JRScriptletException {
        System.out.println(
"**************************************afterDetailEval()**************************************");
    }


    @Override
    
public void afterPageInit() throws JRScriptletException {
        System.out.println(
"**************************************afterPageInit()**************************************");
    }


    @Override
    
public void afterReportInit() throws JRScriptletException {
        System.out.println(
"**************************************afterReportInit() begin**************************************");
        
        String str 
= (String) this.getParameterValue("ReportTitle");
        System.out.println(
"report title=====>>>>"+str);
        
        str 
+= str.subSequence(0, str.length()-2);
        
this.setParameterValue("ReportTitle", str);
        System.out.println(
"**************************************afterReportInit() end**************************************");
    }


    @Override
    
public void beforeColumnInit() throws JRScriptletException {
        System.out.println(
"**************************************beforeColumnInit()**************************************");
    }


    @Override
    
public void beforeDetailEval() throws JRScriptletException {
        System.out.println(
"**************************************beforeDetailEval()**************************************");
    }


    @Override
    
public void beforeGroupInit(String groupName) throws JRScriptletException {
        System.out.println(
"**************************************beforeGroupInit()**************************************");
    }


    @Override
    
public void beforePageInit() throws JRScriptletException {
        System.out.println(
"**************************************beforePageInit()**************************************");
    }


    @Override
    
public void beforeReportInit() throws JRScriptletException {
        System.out.println(
"**************************************beforeReportInit()**************************************");
    }


    
public String showInfor() throws JRScriptletException {
        
return "the is scriptlet scriptlet scriptlet the,sscriptlet report the is ascriptlet report this is a scriptlet report this is a scriptlet report";
    }

    
}

这段代码最后一个方法是我们自己的加的,用来在报表上显示一段文本。我们知道对于一个Field、Parameter、Variable,JasperReport分别采用$F{FieldName}、$P{Parametername}、$V{VariableName}来引用,而如果要引用ScriptletReportDemo.java类的showInfor()返回字符串显示在报表上,看看这个就知道了

在afterReportInit方法中我们把parameter字段取出来前后添上五个*号再set进去
    下来写一个test类测试一下:

package org.bulktree.ireport.scriptlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

/**
 * 
 * 
@author bulktree Email: laoshulin@gmail.com
 * @Nov 27, 2008
 
*/

public class ScriptletTestMain {

    
public static void main(String[] args) {
        String path 
= "D:/workspace/scriptletDemo.jrxml";

        File file 
= new File(path);
        InputStream in;
        
try {

            HashMap parameters 
= new HashMap();
            parameters.put(
"ReportTitle""LAOSHULIN");
            in 
= new FileInputStream(file);
            JasperReport jasperReport 
= JasperCompileManager.compileReport(in);
            JasperPrint jasperPrint 
= JasperFillManager.fillReport(jasperReport,
                    parameters, 
new JREmptyDataSource());
            JasperViewer viewer 
= new JasperViewer(jasperPrint);
            viewer.setVisible(
true);

        }
 catch (Exception e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}


效果不错吧:

getParameterValue、setParameterValue方法可以操作Parameter,Field/Variable该怎么set呢?
    看看 JRAbstractScriptlet.java类的这个方法:

public void setData(
        Map parsm,
        Map fldsm,
        Map varsm,
        JRFillGroup[] grps
        )
    
{
        parametersMap 
= parsm;
        fieldsMap 
= fldsm;
        variablesMap 
= varsm;
        groups 
= grps;
    }

        似乎有点意思,我们可以通过这个方法把我们期望的数据组装成Map然后set进去,可是要只针对个别字段怎么处理呢,调用此方法似乎不太合常理,仔细查看API却没有实际能调用的API吧!这个似乎不太合乎,仔细看看确实没有调用的,至少目前我还是没有发现,怎么办 自己写吧!
    设置Field方法:

public void setFieldValue(String fieldName, Object value) throws JRScriptletException
    
{
        JRFillField field 
= (JRFillField)this.fieldsMap.get(fieldName);
        
if (field == null)
        
{
            
throw new JRScriptletException("FieldName not found : " + fieldName);
        }

        
        field.setValue(value);
    }

    设置Variable方法:

public void setVariableValue(String variableName, Object value) throws JRScriptletException
    
{
        JRFillVariable variable 
= (JRFillVariable)this.variablesMap.get(variableName);
        
if (variable == null)
        
{
            
throw new JRScriptletException("Variable not found : " + variableName);
        }

        
        
if (value != null && !variable.getValueClass().isInstance(value) )
        
{
            
throw new JRScriptletException("Incompatible value assigned to variable " + variableName + ". Expected " + variable.getValueClassName() + ".");
        }

        
        variable.setValue(value);
    }

    OK!这样我们就可以针对报表上的每一个字段处理了,测试通过 代码就不贴了哦,写上篇的时候忘记这两个方法是我自己加的,查看API时才发现所以来了个续

分享到:
评论
1 楼 zerozxg 2014-12-31  
scriptlets怎么访问报表中的dataset呢

相关推荐

    ireport scriptlet脚本的使用

    2. **配置报表模板**:在iReport中打开报表模板(.jrxml文件),在`&lt;jasperReport&gt;`标签下添加`&lt;scriptlet&gt;`子标签,指定你的`Scriptlet`类: ```xml &lt;jasperReport ...&gt; ... &lt;scriptlet class=...

    ireport3中文用户手册+jasperreport 开发详细手册合集

    【标题】"ireport3中文用户手册+jasperreport 开发详细手册合集"涉及的是两款在Java报表开发领域中至关重要的工具:iReport和JasperReport。这两个工具是开源的,广泛用于创建复杂的报告和仪表板,使得数据可视化变...

    ireport+javabean

    首先需要下载iReport和JasperReport的安装包,iReport的安装非常简单,解压后运行iReport.exe程序即可。而JasperReport则需要解压后将所需的jar包拷贝到项目中。iReport的安装依赖于Java虚拟机,如果尚未安装Java...

    IReport与JasperReport开发报表经验总结

    ### IReport与JasperReport开发报表经验总结 在IT领域,报表工具的选择和使用对于数据分析、数据呈现至关重要。本文将基于“**IReport与JasperReport开发报表经验总结**”这一主题,对文档中提到的一些关键问题及其...

    iReport+JasperReports教程

    通过iReport,你可以拖放字段、设置样式、创建复杂的计算公式,以及利用内置的脚本语言JasperReports Scriptlet进行更高级的定制。iReport支持版本控制,这对于团队协作非常有帮助。 在"JasperReport报表设计总结...

    Ireport实现金额大写(自己实现的)

    本文将详细介绍如何使用Ireport内置的Scriptlet功能实现将金额转换为大写的汉字表示,这对于财务报表的制作尤为重要,因为在中国,金额通常需要以中文大写的形式出现,以增加数据的准确性,防止篡改。 首先,我们要...

    iReport5.6&Jasperreport;开发报表所需全部jar.zip

    这里我们关注的是"IReport5.6&Jasperreport;开发报表所需全部jar.zip"这个压缩包,它包含了这两个工具在开发过程中所需的全部Java Archive (JAR) 文件。 JasperReports是一个强大的Java库,能够生成各种类型的报表...

    JasperReport 学习之路

    ### JasperReport 学习之路 #### 一、简介与背景 JasperReport是一种基于Java的报表生成技术,它被广泛应用于企业级应用中用于生成复杂且格式化良好的PDF文档。对于初学者而言,掌握JasperReport的核心概念和技术...

    iReport开发手册

    - **编写查询**:在查询编辑器中编写SQL或使用JasperReports内置的语言JasperReport Scriptlet。 - **预览和测试**:在预览模式下查看报表效果,进行调整和测试。 - **保存和导出**:保存报表模板,导出为所需格式。...

    jasperreport笔记1

    5. **表达式和变量**:掌握JasperReports的表达式语言JasperReport Scriptlet和变量,用于计算、过滤数据。 6. **报表元素**:学习如何创建表格、图表、子报表等复杂元素,以及如何进行交互式操作。 7. **导出和...

    JasperReport使用手册 - JasperReport - 软件开发 - 深度开源.html

    是一款报表打印组件,是开放源代码组织 中的一个 报表打印工程, JasperReport sf.net 由于 本身并未提供很好的可视化报表设计工具, JasperReport 在之后推出了 iReport ,作为 报表模版编辑软件,具有以下突出的...

    (三)Ireport制作报表(欢迎加群组http://jaspereport.group.iteye.com)

    "EmployeeInfo.pdf"则代表生成的PDF格式报表,它是报表设计完成后常见的输出格式之一,方便打印或电子分发。 知识点详解: 1. **IReport简介**:IReport是JasperSoft Studio的早期版本,是基于Eclipse的报表设计...

    iReport中文教程.doc

    * 集成脚本(scriptlet)支持 * 内置图表支持:超过20种图表支持,并可扩展 * 国际化:集成超过15种语言 * 报表模板与报表库样式管理 * 源文件的备份 * 文档结构浏览器 iReport的安装 iReport运行时需要Sun Java2 ...

    jasperreports-javaflow-6.3.0.7z_JASPERREPORT_

    设计者可以利用内置的样式和表达式语言(JasperReports Scriptlet Language)来实现动态计算和格式化。 2. **数据源集成** JasperReports能够处理多种数据源,包括SQL数据库、JavaBeans、CSV文件、XML数据等。通过...

    JasperReports 报表类库v3.5.zip

    此外,还可以使用JasperReports自己的内嵌脚本语言JasperReport Scriptlet进行更精细的控制。 5. **图表生成**:JasperReports内置了多种图表类型,如柱状图、饼图、线图等,可以轻松地将数据转换为直观的可视化...

Global site tag (gtag.js) - Google Analytics