提起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 "http://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();
}

}
}

效果不錯吧:
posted on 2008-12-17 10:00
凌晨風 閱讀(7687)
評論(6) 編輯 收藏 所屬分類:
iReport + JasperReport 系列