`
atian25
  • 浏览: 468775 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Birt动态填充DataSet数据

    博客分类:
  • Birt
阅读更多
看了很久的api才发现...汗死..

主要用处是结合程序来填充数据
一般做法是用ScriptDataSet,然后在报表的脚本里面调用外部class取数据.但是总感觉不爽...调试不方便.

于是如下,只要继承该类,覆盖fillDataList方法以提供自己的数据.
并在birt里面设置某个dataset的事件处理函数类为该类

ps:报表必须定义2个参数:
1.conditions,String类型,即查询参数,格式paramName1=value1&paramName2=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&paramName2=value2
     */
    protected String conditions = "";

    /**
     * 解析后的报表参数
     */
    protected Map<String, String> conditionMap = new HashMap<String, String>();

    /**
     * 是否是设计阶段
     */
    protected boolean isDesign = false;

    /**
     * DataSet的Meta对象,用来读取列名
     */
    protected IColumnMetaData meta = null;

    /**
     * DataSet的列数
     */
    protected int metaCount = 0;

    /**
     * 数据对象列表
     */
    protected List<Map<String, String>> dataList = new ArrayList<Map<String, String>>();
    /**
     * 变量数据对象
     */
    protected Iterator<Map<String, String>> it = null;

    @Override
    public void beforeOpen(IDataSetInstance dataSet, IReportContext reportContext) throws ScriptException {
        try {
            conditions = (String) reportContext.getParameterValue(Key_ReportConditions);
            //解析参数
            if (validateConditions(conditions)) {
                parseConditions(conditions);
            }
            isDesign = Boolean.parseBoolean(String.valueOf(reportContext.getParameterValue(Key_IsDesign)));
        } catch (Exception e) {
            logger.error("获取报表参数错误(beforeOpen),Msg:{}", e);
        }
    }

    /**
     * 验证报表参数的格式是否符合格式:paramName1=value1&paramName2=value2
     */
    public boolean validateConditions(String str) {
        boolean result = Pattern.matches(Regex_Conditions_Valid, str);
        logger.debug("参数{}规则,Obj:{}", result ? "符合" : "不符合", str);
        return result;
    }

    /**
     * 把报表参数解析成map
     */
    public void parseConditions(String str) {
        Matcher m = Pattern.compile(Regex_Conditions_Parse).matcher(str);
        while (m.find()) {
            conditionMap.put(m.group(1), m.group(2));
        }
        logger.debug("成功解析参数(beforeOpen),Obj:{}", conditionMap);
    }

    /**
     * 覆盖来实现数据列表的填充
     * 一般是通过SpringUtils.getBean()得到数据提供者,如dataProvider = SpringContextUtil.getBean("beanname");
     * 然后调用list = dataProvider.getSomeDataList(conditions)传递参数去统计,然后dataList.addAll(list);
     */
    protected void fillDataList() {
    }

    /**
     * 填充测试数据
     */
    protected void fillTestData() {
        for (int i = 0; i < 5; i++) {
            Map<String, String> map = new HashMap<String, String>();
            try {
                for (int j = 0; j < metaCount; j++) {
                    String colName = meta.getColumnName(j + 1);
                    String colData = "ColName:" + colName + ",RowIndex:" + i + ",Conditions:" + conditions;
                    map.put(colName, colData);
                }
            } catch (ScriptException e) {
                e.printStackTrace();
            }
            dataList.add(map);
        }
    }

    @Override
    public void open(IDataSetInstance dataSet) throws ScriptException {
        try {
            meta = dataSet.getColumnMetaData();
            metaCount = meta.getColumnCount();
            //填充数据
            if (isDesign) {
                this.fillTestData();
            } else {
                this.fillDataList();
            }
            it = dataList.iterator();
        } catch (Exception e) {
            logger.error("获取报表初始化错误(Open),Msg:{}", e);
        }
    }

    @Override
    public boolean fetch(IDataSetInstance dataSet, IUpdatableDataSetRow row) throws ScriptException {
        if (it == null || !it.hasNext()) {
            return false;
        } else {
            try {
                Map<String, String> data = it.next();
                //遍历meta,填值
                for (int i = 0; i < metaCount; i++) {
                    String colName = meta.getColumnName(i + 1);
                    String colData = data.get(colName);
                    row.setColumnValue(colName, colData);
                }
            } catch (ScriptException e) {
                logger.error("获取报表数据错误(fetch),Msg:{}", e);
            }
            return true;
        }
    }

    @Override
    public void close(IDataSetInstance dataSet) throws ScriptException {
        meta = null;
        dataList = null;
        it = null;
        conditionMap = null;
    }

    @Override
    public boolean describe(IDataSetInstance dataSet, IScriptedDataSetMetaData metaData) throws ScriptException {
        //用来动态改变dataset的meta,在open之前调用
        return false;
    }

    @Override
    public void onFetch(IDataSetInstance dataSet, IDataSetRow row, IReportContext reportContext) throws ScriptException {
    }

    @Override
    public void afterOpen(IDataSetInstance dataSet, IReportContext reportContext) throws ScriptException {
    }

    @Override
    public void beforeClose(IDataSetInstance dataSet, IReportContext reportContext) throws ScriptException {

    }

    @Override
    public void afterClose(IReportContext reportContext) throws ScriptException {
    }
}

分享到:
评论
5 楼 xiaoyueyue5721 2014-11-18  
这是ScriptDataSet,如果换成OdaDataSet呢?
实现的接口不能是IScriptedDataSetEventHandler,换成IDataSetEventHandler
但是IDataSetEventHandler里没有public boolean fetch(IDataSetInstance dataSet, IUpdatableDataSetRow row) throws ScriptException {}这个方法,只有IUpdatableDataSetRow类型的row才可以设置,我该怎么做呢?
4 楼 wlbaixue 2010-03-15  
关键是Action 里还要加载这个类,要不获取不到这个类,一直报classnotfound的错误
HashMap context = new HashMap();
context.put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY,类名.class.getClassLoader());
task.setAppContext(context);
这样就可以了
3 楼 wlbaixue 2010-03-15  
谢谢啦,我搞定了,花了三天的时间,终于把数据提取出来了
2 楼 atian25 2010-03-11  
在birt里面设置某个dataset的事件处理函数类为该类
1 楼 wlbaixue 2010-03-11  
您能不能说一下在.rptdesign文件里怎么接收数据啊,是什么都不用写吗?

相关推荐

    动态生成DataSet填充数据并导成Excel格式

    本文将深入探讨如何使用C#编程语言动态生成DataSet来填充数据,并将其导出为Excel格式。这个过程涉及到几个关键步骤,包括创建DataSet、设置数据表结构、填充数据以及将数据转换为Excel格式。 1. **动态生成DataSet...

    Faster-RCNN鸟类检测 bird_dataset飞鸟检测数据集.rar

    VOC鸟类检测数据集,标签格式为xml和txt两种,类别名为bird, 数量有1万多张,可以直接用于目标检测 SSD、YOLOv3、Faster-RCNN等鸟类检测

    YOLOv5飞鸟检测 bird_dataset-1.zip

    这个数据集,名为"bird_dataset-1.zip",专为训练YOLOv5模型进行鸟类检测而设计,包含了丰富的训练资源。以下是关于YOLOv5、目标检测以及该数据集的详细知识点: 1. **YOLO(You Only Look Once)**: YOLO是实时...

    鸟类物种数据集 Bird Speciees Dataset(800+张图像)JPG

    鸟类物种数据集包含有关六种不同鸟类的图像和信息。每个物种都有独特的视觉和生物特征,为训练模型或在图像分类、野生动物研究和鸟类学等领域进行研究提供了多样化的集合。 该数据集包括以下鸟类: 美国金翅雀:一...

    Silverlight连接数据数据库DataSet填充数据

    本主题将深入探讨如何在Silverlight应用中连接数据库并使用DataSet来填充数据,不依赖于WCF或WebService服务。 首先,让我们了解DataSet。DataSet是.NET框架中的一个对象,它在内存中存储数据,并提供了类似数据库...

    C#手动填充DataSet

    C#手动填充DataSet

    asp.net使用DataSet数据集插入表记录

    数据适配器(`SqlDataAdapter`)充当了`DataSet`和数据库之间的桥梁,使得我们可以轻松地填充`DataSet`或更新数据库。 ```csharp string sqlQuery = "select * from mynews"; SqlDataAdapter dataAdapter = new ...

    光伏组件elpv-dataset数据集

    光伏组件elpv-dataset数据集是一个专门为深度学习设计的开源资源,主要用于训练光伏组件缺陷识别模型。这个数据集对于太阳能产业至关重要,因为它可以帮助提高太阳能电池板的维护效率和发电效率,减少因组件缺陷导致...

    CUHK Occlusion Dataset数据集 yolo格式+VOC格式 包括划分好的训练集和数据集

    CUHK Occlusion Dataset数据集,用于行人检测,做好了yolo格式数据集的训练和划分,同时上传了yolo和voc两个格式的标签集。 包括:1.VOC格式(.xml文件)的数据集 2.yolo格式(.txt文件)的数据集 3.划分好的yolo...

    使用数据绑定和DataSet

    使用数据绑定和DataSet 在软件开发中,数据绑定是指将数据集DataSet等数据对象绑定到应用程序的控件中,然后将数据显示给用户查看或者操作。数据绑定在程序开发与设计中十分重要,本章通过介绍数据绑定和数据集...

    C#遍历DataSet中数据的几种方法总结

    在C#编程中,`DataSet`是一个非常重要的数据容器,它可以容纳多个`DataTable`,每个`DataTable`又包含多行`DataRow`和多列`DataColumn`的数据。当我们需要处理或展示`DataSet`中的所有数据时,遍历就显得尤为重要。...

    Winform通过DataSet数据绑定DataGridView

    它可以动态地显示来自各种数据源的数据,包括数组、ArrayList、DataSet、DataTable等。将数据绑定到DataGridView,可以使用户直观地查看、编辑和操作数据。 在给定的文件列表中,我们可以看到以下关键文件: 1. `...

    C#实现读取DataSet数据并显示在ListView控件中的方法

    接下来,你需要从数据库查询数据并将结果填充到DataSet中。在这个例子中,`student.QueryStudents()` 是一个假设的查询方法,它从数据库中获取学生信息并返回一个DataSet: ```csharp ds = student.QueryStudents();...

    DataSet填充

    C# Winform开发中常会调用SQL数据库中数据,这里给出了数据库数据向DataSet填充数据的详细过程和注释说明,希望对C#和数据库的初学者有帮助

    twitter数据流数据(数据集dataset).zip

    twitter数据流数据(数据集dataset).ziptwitter数据流数据(数据集dataset).ziptwitter数据流数据(数据集dataset).ziptwitter数据流数据(数据集dataset).ziptwitter数据流数据(数据集dataset).ziptwitter...

    把dataset中的数据存入到水晶报表中去

    总结起来,通过C#和ADO.NET,我们可以方便地从数据库获取数据并将其存储在DataSet中,再将DataSet中的数据集成到水晶报表中,从而创建出动态、丰富的业务报表。这个过程涉及了数据库连接、数据检索、数据绑定等多个...

    ADO.NET_DataSet(数据集

    在DEMO_DataSet数据集中,可能包含了如何创建和使用DataSet的实例,包括如何填充数据、如何处理数据关系、如何执行数据验证,以及如何将DataSet中的更改保存回数据库等操作步骤。通过阅读和实践这些示例,开发者可以...

    asp.net 使用数据绑定和DataSet

    在ASP.NET中,数据绑定和DataSet是两个非常关键的概念,它们是构建动态Web应用程序的核心工具。数据绑定允许我们在页面上动态地展示数据,而DataSet则是一个内存中的数据存储和处理对象,可以用来缓存和操作从数据库...

Global site tag (gtag.js) - Google Analytics