阅读更多
看了很久的api才发现...汗死..
主要用处是结合程序来填充数据
一般做法是用ScriptDataSet,然后在报表的脚本里面调用外部class取数据.但是总感觉不爽...调试不方便.
于是如下,只要继承该类,覆盖fillDataList方法以提供自己的数据.
并在birt里面设置某个dataset的事件处理函数类为该类
ps:报表必须定义2个参数:
1.conditions,String类型,即查询参数,格式paramName1=value1¶mName2=value2
2.isDesign,Boolean类型,是否设计阶段,用来在Birt设计器里面预览用
package com.symbol.elvisapp.report;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.birt.report.engine.api.script.IColumnMetaData;
import org.eclipse.birt.report.engine.api.script.IDataSetRow;
import org.eclipse.birt.report.engine.api.script.IReportContext;
import org.eclipse.birt.report.engine.api.script.IScriptedDataSetMetaData;
import org.eclipse.birt.report.engine.api.script.IUpdatableDataSetRow;
import org.eclipse.birt.report.engine.api.script.ScriptException;
import org.eclipse.birt.report.engine.api.script.eventhandler.IScriptedDataSetEventHandler;
import org.eclipse.birt.report.engine.api.script.instance.IDataSetInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Birt DataSet的回调函数,用来给dataset赋值.
* 关键的方法:
* 1.beforeOpen 用来获取参数
* 2.open 用来调用数据集取值
* 3.fetch 用来填充数据,该函数会一直被调用直到返回false
* 4.close 用来释放资源,记得把open里面缓存的数据引用置为null
* 5.describe 用来动态改变dataset的meta,在open之前调用
* 6.fillDataList 用来填充数据集,一般子类只需要覆盖该类即可使用.
*/
public class BaseDataSetEventHandler implements IScriptedDataSetEventHandler {
protected Logger logger = LoggerFactory.getLogger(getClass());
public static String Key_ReportConditions = "conditions";
public static String Key_IsDesign = "isDesign";
public static String Regex_Conditions_Valid = "([^=]+=[^&]*(?:&?))*";
public static String Regex_Conditions_Parse = "([^=]+)=([^&]*)(?:&?)";
/**
* 报表参数
* 格式为 paramName1=value1¶mName2=value2
*/
protected String conditions = "";
/**
* 解析后的报表参数
*/
protected Map conditionMap = new HashMap();
/**
* 是否是设计阶段
*/
protected boolean isDesign = false;
/**
* DataSet的Meta对象,用来读取列名
*/
protected IColumnMetaData meta = null;
/**
* DataSet的列数
*/
protected int metaCount = 0;
/**
* 数据对象列表
*/
protected List