`
kjj
  • 浏览: 171635 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

BIRT 使用xml动态数据源总结

阅读更多
因为系统需要,添加报表功能,瞄上了birt,学习之,入门教程看了一大堆,还好,多种数据源支持,对于sql还没精通,看着一大堆sql还有点犯难,所以,xml数据源成了我的首选,仔细研究之下,发现原来birt提供的初级功能原来很少,报表经常需要替换数据源来显示其不同的内容,而传统的设置 xml数据源只是事前指定好xml文件,或url,google了一下,基本没有发现可用 的例子,郁闷之,自己琢磨了一周几乎,更郁闷的是其实问题早有了答案,就载在acegi的权限控制之上一直未看到胜利的曙光下面把自己动态修改xml数据源的成功发上来我用的是webwork,其他用户请酌情修改相应参数
这个是用来view报表的action 需要传入的参数是
reban.reportName = 报表文件的文件名
rbean.xmlDataUrl = 报表xml datasource url ,可以是stream,或xxx.xml之类的,输入浏览器能显示xml即可
BirtReportViewer.java
  package com.morepower.controller.birt;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.HTMLServerImageHandler;
import org.eclipse.birt.report.engine.api.IHTMLRenderOption;
import org.eclipse.birt.report.engine.api.IRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.model.api.DataSourceHandle;
import org.eclipse.birt.report.model.api.ElementFactory;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.TableHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;


import com.morepower.controller.AbstractAction;
import com.morepower.util.BirtEngine;
import com.morepower.view.BirtReporterBean;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.webwork.interceptor.ServletRequestAware;

public class BirtReportViewer extends AbstractAction implements
		ServletRequestAware {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static String REPORT_DIR = "birt-reportors";
	private static String REPORT_IMAGE_DIR = "images";
	private IReportEngine birtReportEngine = null;
	private HttpServletRequest request;
	private BirtReporterBean rbean;
	private InputStream reportStream;
	private static String DATASOURCE_NAME = "DataSource";
	private static String DATASET_NAME = "DataSet";
	private static String QueryText = "";

	public InputStream getReportStream() {
		return this.reportStream;
	}

	@Override
	public String execute() throws Exception {
		// get report name and launch the engine
		// resp.setContentType("text/html");
		// resp.setContentType( "application/pdf" );
		// resp.setHeader ("Content-Disposition","inline; filename=test.pdf");
		String reportName = rbean.getReportName();
		ServletContext sc = ServletActionContext.getServletContext();
		birtReportEngine = BirtEngine.getBirtEngine(sc);
		IReportRunnable design = birtReportEngine.openReportDesign(sc
				.getRealPath(java.io.File.separator + REPORT_DIR)
				+ java.io.File.separator + reportName);

		ReportDesignHandle report = (ReportDesignHandle) design
				.getDesignHandle();

		// 只是动态更换数据源即可,不需改变报表的其他结构
		// 暂时不支持动态创建表格

		// create task to run and render report
		buildReport(report);
		IRunAndRenderTask task = birtReportEngine
				.createRunAndRenderTask(design);
		task.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY,
				BirtReportViewer.class.getClassLoader());

		// set output options
		HTMLRenderOption options = new HTMLRenderOption();
		options.setImageHandler(new HTMLServerImageHandler());
		options.setImageDirectory(sc.getRealPath(java.io.File.separator
				+ REPORT_IMAGE_DIR));
		options.setBaseImageURL(request.getContextPath()
				+ java.io.File.separator + REPORT_IMAGE_DIR);
		options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
		options.setOption(IRenderOption.HTML_PAGINATION, Boolean.TRUE);
		options.setOption(IHTMLRenderOption.MASTER_PAGE_CONTENT, new Boolean(
				true));
		
		// options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
		options.setOption(HTMLRenderOption.HTML_ENABLE_METADATA, Boolean.FALSE);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		//String renderstr = bout.toString("utf-8");
		options.setOutputStream(bout);		
		task.setRenderOption(options);
				
		/*
		 * 另外一种方案,直接在action中构造inputStream 对像,但这样
		 * 可能导致你的报表viewer与具体业务类耦合!
		 * task.getAppContext().put(org.eclipse.datatools.enablement.oda.xml.Constants.APPCONTEXT_INPUTSTREAM,
				reportStream);
		task.getAppContext().put(org.eclipse.datatools.enablement.oda.xml.Constants.APPCONTEXT_CLOSEINPUTSTREAM,
				Boolean.TRUE);*/
		        
				// run report
		
		task.run();
		task.close();		
		reportStream =  new ByteArrayInputStream(bout.toByteArray());
		
        return SUCCESS;
	}

	/**
	 * 清除原有的数据源
	 */
	protected void clearDataSource(ReportDesignHandle designHandle) {
		//DataSourceHandle dsh = designHandle.findDataSource(DATASOURCE_NAME);
		//dsh.drop();
		int count = designHandle.getDataSources().getCount();

		try {
			for (int i = 0; i < count; i++)
				designHandle.getDataSources().drop(i);
		} catch (SemanticException e) {
			log.error(e);
			e.printStackTrace();
		}
	}

	/**
	 * 清除原有的数据集
	 */
	protected void clearDataSet(ReportDesignHandle designHandle) {
		getQueryText(designHandle);
		int count = designHandle.getDataSets().getCount();
		try {
			for (int i = 0; i < count; i++)
				designHandle.getDataSets().drop(i);
		} catch (SemanticException e) {
			log.error(e);
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	protected void getQueryText(ReportDesignHandle designHandle) {
		QueryText = (String) designHandle.getDataSets().get(0).getProperty(
				"queryText");
	}

	protected void buildReport(ReportDesignHandle designHandle) {
		try {
			ElementFactory designFactory = designHandle.getElementFactory();
			buildDataSource(designFactory, designHandle);
			buildDataSet(designFactory, designHandle);
			TableHandle table = (TableHandle) designHandle.getBody().get(0);
			table.setDataSet(designHandle.findDataSet(DATASET_NAME));

		} catch (SemanticException e) {
			log.error(e);
			e.printStackTrace();
		}

	}

	protected void buildDataSource(ElementFactory designFactory,
			ReportDesignHandle designHandle) throws SemanticException {
		clearDataSource(designHandle);
		OdaDataSourceHandle dsHandle = designFactory.newOdaDataSource(
				DATASOURCE_NAME,
				"org.eclipse.birt.report.data.oda.xml" );
		/*dsHandle.setProperty( "odaDriverClass",
 		"com.mysql.jdbc.Driver" );
		dsHandle.setProperty( "odaURL", "jdbc:mysql://localhost/stat" );
		dsHandle.setProperty( "odaUser", "root" );
		dsHandle.setProperty( "odaPassword", "" );*/
		dsHandle.setProperty("FILELIST", rbean.getXmlDataUrl());		
    	designHandle.getDataSources().add(dsHandle);
	}

	protected void buildDataSet(ElementFactory designFactory,
			ReportDesignHandle designHandle) throws SemanticException {

		clearDataSet(designHandle);
		OdaDataSetHandle dsHandle = designFactory.newOdaDataSet( DATASET_NAME,
		//"org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
     	/*	OdaDataSetHandle dsHandle = designFactory.newOdaDataSet(DATASET_NAME,*/
				"org.eclipse.birt.report.data.oda.xml.dataSet");
		dsHandle.setPrivateDriverProperty("XML_FILE", rbean.getXmlDataUrl());
		dsHandle.setPrivateDriverProperty("MAX_ROW", "-1");
		dsHandle.setQueryText(QueryText);
		dsHandle.setDataSource(DATASOURCE_NAME);
		designHandle.getDataSets().add(dsHandle);

	}

	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		request = arg0;

	}

	@Override
	public void destory() {
		BirtEngine.destroyBirtEngine();
	}

	public BirtReporterBean getRbean() {
		return rbean;
	}

	public void setRbean(BirtReporterBean rbean) {
		this.rbean = rbean;
	}

	@Override
	public void initilize() {
		try {
			log.info("报表系统初始化中............");
			BirtEngine.initBirtConfig();
			REPORT_DIR = BirtEngine.getBirtReportorProperty("report_dir");
			REPORT_IMAGE_DIR = BirtEngine
					.getBirtReportorProperty("report_image_dir");
			DATASOURCE_NAME = "DataSource";
			DATASET_NAME = "DataSet";
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e);
		}
	}

}






BirtEngine.java
  package com.morepower.util;
import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportEngine;
import javax.servlet.*;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.core.framework.IPlatformContext;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;

public class BirtEngine {
	private static IReportEngine birtEngine = null;
	private static Properties configProps = new Properties();
	private final static String configFile = "BirtConfig.properties";
	protected final static Log log = LogFactory.getLog(BirtEngine.class);
	public static synchronized void initBirtConfig() {
		
		loadEngineProps();
	}

	public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
		if (birtEngine == null) {
			EngineConfig config = new EngineConfig();
			if (configProps != null) {
				String logLevel = configProps.getProperty("logLevel");
				Level level = Level.OFF;
				if ("SEVERE".equalsIgnoreCase(logLevel)) {
					level = Level.SEVERE;
				} else if ("WARNING".equalsIgnoreCase(logLevel)) {
					level = Level.WARNING;
				} else if ("INFO".equalsIgnoreCase(logLevel)) {
					level = Level.INFO;
				} else if ("CONFIG".equalsIgnoreCase(logLevel)) {
					level = Level.CONFIG;
				} else if ("FINE".equalsIgnoreCase(logLevel)) {
					level = Level.FINE;
				} else if ("FINER".equalsIgnoreCase(logLevel)) {
					level = Level.FINER;
				} else if ("FINEST".equalsIgnoreCase(logLevel)) {
					level = Level.FINEST;
				} else if ("OFF".equalsIgnoreCase(logLevel)) {
					level = Level.OFF;
				}

				config.setLogConfig(configProps.getProperty("logDirectory"),
						level);
			}
           //sc.getRealPath("")+java.io.File.separator+configProps.getProperty("engine_home")
			config.setEngineHome("");
			IPlatformContext context = new PlatformServletContext(sc);
			log.info(context.getPlatform());
			config.setPlatformContext(context);

			try {
				Platform.startup(config);
			} catch (BirtException e) {
				e.printStackTrace();
			}

			IReportEngineFactory factory = (IReportEngineFactory) Platform
					.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
			birtEngine = factory.createReportEngine(config);

		}
		return birtEngine;
	}

	public static synchronized void destroyBirtEngine() {
		if (birtEngine == null) {
			return;
		}
		birtEngine.shutdown();
		Platform.shutdown();
		birtEngine = null;
	}

	public Object clone() throws CloneNotSupportedException {
		throw new CloneNotSupportedException();
	}

	private static void loadEngineProps() {
		try {
			// Config File must be in classpath
			ClassLoader cl = Thread.currentThread().getContextClassLoader();
			InputStream in = cl.getResourceAsStream(configFile);
			configProps.load(in);
			in.close();

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	public static String getBirtReportorProperty(String key){
		return configProps.getProperty(key);
	}

}


robin 写道

使用方法
在浏览器中输入url
  http://localhost:8800/stat/birtviewer.action?rbean.reportName=index.rptdesign&rbean.xmlDataUrl=http://localhost:8800/stat/armrptxml.action?reporter.id=008a81b61c30d47e011c4f446718001b

对报表熟悉的人应该知道这个方法
0
0
分享到:
评论

相关推荐

    BIRT使用xml动态数据源总结.docx

    描述中提到,由于对SQL不够熟悉,作者选择了XML数据源,但在尝试过程中发现BIRT的初级功能对动态数据源的支持有限。传统方法是预先设定XML文件或URL,但作者需要根据不同情况替换数据源内容,却未能找到相关示例。...

    birt xml数据源

    总结起来,BIRT XML数据源提供了一种有效的方法来处理和展示XML格式的数据,为开发人员在报表设计中提供了更大的灵活性。通过正确配置和使用,可以充分利用XML数据的结构化特性,生成具有洞察力的报表和分析结果。

    birt使用xml数据源

    总结来说,使用BIRT与XML数据源相结合,能够帮助开发者高效地处理和展示结构化的XML数据。通过理解BIRT的数据源配置、数据集创建以及报表设计,你可以轻松地将XML文件中的信息转化为直观的报表,这对于数据驱动的...

    birt 报表动态数据源设置方法

    4. **在运行时应用动态数据源**:当报表运行时,BIRT会使用这些参数值填充到数据源的连接字符串中,从而动态地连接到指定的数据库。 5. **测试和验证**:确保动态数据源配置正确无误后,可以运行报表进行测试,观察...

    Birt XML详解

    本文将深入探讨Birt报表XML数据源的配置以及报表配置的相关知识点。 **1. Birt XML数据源配置** 在Birt中,XML数据源允许开发者从XML文档或XML Web服务中提取数据。配置XML数据源主要包括以下几个步骤: 1. **...

    birt 动态数据源

    标题 "BIRT 动态数据源" 指的是Business Intelligence and Reporting Tools(BIRT)框架中的一个特性,允许报告开发者在运行时动态地选择或更改数据源。BIRT是开源的Java EE平台,用于创建数据可视化和业务智能报告...

    用pojo对象作birt的数据源

    在BIRT中,数据源通常可以是数据库连接、XML文件、Web服务等。然而,当数据源为动态生成或者来自复杂的业务逻辑时,直接使用POJO对象作为数据源更为合适。这允许我们直接操作Java对象,避免了中间转换步骤,提高效率...

    BIRT使用经验谈。birt的初步使用方法

    **数据源与数据集:** 报表的数据来源于数据源,BIRT支持多种类型的数据源,如数据库、XML、Web服务等。在设计视图中,右键单击“Data Explorer” -&gt; “New Data Source”,按照向导配置相应的数据连接信息。接着,...

    birt api动态创建表格

    3. **设置数据源和数据集**: BIRT支持多种数据源类型,如JDBC、XML等。通过`IReportRunnable`接口的`getDataSources`和`getDataSets`方法获取并设置数据源和数据集。 4. **创建报表参数**: 如果报表需要参数,可以...

    birt api 实现动态列参数报表

    在BIRT中,报表设计通常由一个XML文件(.rptdesign)定义,包括数据源、数据集、布局等元素。要实现动态列,我们需在运行时动态修改数据集的SQL查询,将`columnNames`中包含的列名添加到SELECT语句中。这样,数据...

    birt 3.7 源代码 天涯浪子

    数据引擎支持多种数据源,包括数据库、XML和Web服务。图表引擎则生成各种图形,使数据可视化。 2. **BIRT 3.7版本**: BIRT 3.7发布于2011年6月,该版本包含了一系列改进和新功能。例如,增强了对大数据源的支持,...

    BIRT使用说明

    3. **数据源配置**:根据项目需求,配置各种数据源,如数据库、XML文件或Web服务等。 **三、报表设计** 1. **新建报表项目**:在Eclipse中,通过“File” -&gt; “New” -&gt; “BIRT” -&gt; “Report”来创建一个新的报表...

    birt viewer源代码

    3. **Data Access**:Birt Viewer支持多种数据源,包括关系型数据库、XML、Web服务等。源代码中包含了数据适配器(Data Adapter)的实现,允许开发者自定义数据访问策略。 4. **Parameter Handling**:报表通常需要...

    Birt使用手册

    * 数据源:数据的来源,或提供者,如 xml 数据源、jdbc 数据源等。 * 数据集:数据集合,它必须与数据源关联,可以理解为查询的结果。 * 报表和报表项,报表可视为是针对一组数据集的表现形式,而报表项这是这个表现...

    BIRT使用经验谈.doc

    1. **BIRT简介**:BIRT是一个基于Eclipse的开放源代码报表系统,它提供了丰富的报告设计工具,支持多种数据源,包括关系数据库、XML数据、Java对象等。BIRT不仅适用于Java环境,还可以与其他编程语言集成,提供Web和...

    Birt与MyEclipse的集成及Birt的部署问题

    数据源是数据的来源,如XML数据源或JDBC数据源。数据集是数据的集合,通常与数据源关联,相当于查询结果。报表是对一组数据集的可视化展示,而报表项是报表中的具体单元,类似于窗体和控件。报表、数据集和数据源...

    birt中文使用说明

    BIRT是Eclipse基金会的一个项目,它提供了一个灵活的报表设计环境,支持多种数据源,包括关系数据库、XML、Web服务等。BIRT分为两大部分:设计时组件(Design-time)和运行时组件(Run-time)。设计时组件允许开发者...

    BIRT的集成开发教程

    作为Eclipse基金会下的一个项目,BIRT凭借其强大的功能,如广泛的数据库产品兼容性、XML数据源支持、文本文件数据源处理能力,以及对Java程序生成的数据源的灵活性,迅速在报表设计领域崭露头角。 #### 二、BIRT...

Global site tag (gtag.js) - Google Analytics