birt使用quartz框架实现自动生成报表

原创 2011年01月13日 18:25:00

    经过两天的学习,终于通过quartz框架将birt的自动生成报表功能实现了,下面将代码粘贴上来,仅供参考。

   1、GenReportAutoDs类,用来生成报表。其中资源库文件位于工程根目录下的library下,因此需要单独设置,另外报表需要两个参数,也一并赋值。

package cn.xxt.test;

import java.util.Date;

import javax.servlet.ServletContext;

import org.eclipse.birt.core.framework.IPlatformContext;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.springframework.web.context.ContextLoader;

import cn.xxt.util.DateUtil;

public class GenReportAutoDs {
 @SuppressWarnings("unchecked")
 public void runReport() {
  System.out.println(DateUtil.format(new Date(), "HH:mm:ss", false)+":开始生成包含library报表……");
  IReportEngine birtEngine = null;
  EngineConfig config = new EngineConfig();
  ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
  IPlatformContext context = new PlatformServletContext(servletContext);
  String path = servletContext.getRealPath("/report");
  config.setPlatformContext(context);
  config.setResourcePath(servletContext.getRealPath("/library"));
  try {
   Platform.startup(config);
   IReportEngineFactory factory = (IReportEngineFactory) Platform
     .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
   birtEngine = factory.createReportEngine(config);
   IReportRunnable design = null;
   design = birtEngine.openReportDesign(path
     + "/test/cascading.rptdesign");
   IRunAndRenderTask task = birtEngine.createRunAndRenderTask(design);
   task.getAppContext().put(
     EngineConstants.APPCONTEXT_CLASSLOADER_KEY,
     GenReportAutoDs.class.getClassLoader());
   task.setParameterValue("province", 1);
   task.setParameterValue("city", 372);
   HTMLRenderOption options = new HTMLRenderOption();
   options.setOutputFileName(path + "/test/output/cascading"
     + DateUtil.format(new Date(), "HH-mm", false) + ".pdf"); // 生成pdf文件保存在output文件夹里。
   options.setOutputFormat("pdf");
   options.setHtmlRtLFlag(false);
   options.setEmbeddable(false);
   task.setRenderOption(options);
   task.run();
   task.close();
   birtEngine.destroy();
   //System.out.println("关闭引擎……");
   //不可调用,否则报异常
   //Platform.shutdown();
   //System.out.println("关闭平台……");
   System.out.println(DateUtil.format(new Date(), "HH:mm:ss", false)+":包含library报表生成完成!");
  } catch (Exception e) {
   System.out.println("使用库导出报表失败!");
   System.err.println("错误原因:"+e.getMessage());
  }
 }
}
    2、新建quartz配置文件,内容如下:

    <?xml version="1.0" encoding="gbk"?>
<beans xmlns="
http://www.springframework.org/schema/beans"
       xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="
http://www.springframework.org/schema/context"      
       xsi:schemaLocation="
http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
          
http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true">

 <bean name="timingSet" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject" ref="genReportAutoDs"></property>
  <property name="targetMethod" value="runReport"></property>
 </bean>
 
 <bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="timingSet"></property>
  <property name="cronExpression" value="0 0/1 * * * ?"></property>
 </bean>
 
 <bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
  <property name="triggers"> 
   <list> 
    <ref bean="cronTrigger"/>
   </list> 
  </property>
  <property name="autoStartup" value="true"/>
 </bean>

</beans>

蓝色标注部分为GenReportAutoDs类对应的bean对象。

     3、启动tomcat服务,可以舒服的看到报表文件按照设定的周期生成啦,心里那个爽歪歪^_^

 

说明:碰到的问题和解决办法:

         1、报表文件无法加载library文件的问题。由于后台调用的java代码无法读取web.xml里的内容,所以需要单独设置资源文件的路径,设置方法为config.setResourcePath(servletContext.getRealPath("/library"));
         2、Platform.shutdown()方法在生成报表后不可调用,否则会产生第一次生成成功,第二次报异常的问题,查了很多资料才找到原因,很崩溃。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Azure云数据库报表自动生成Excel 并自动发送邮件实现

由于正式环境假设在微软云上,使用的数据库也是DB云服务,所以目前的SQL SERVER数据库仅支持表、视图的查询和修改,类似于作业、存储过程、管理等权限,全部不能使用(按照微软的说法是,这样DB库就是...

mysql数据自动生成报表软件

  • 2013-12-24 15:27
  • 11.34MB
  • 下载

android 自动生成html报表图片

利用webview的catch ,可以先将数据生成html文件,再用webview读取html,截屏生成jpg.因为html的样式可以随意定制,这样也可以很容易的将长文字转换成图片。 ...

Birt报表生成使用教程

  • 2010-08-18 12:07
  • 578KB
  • 下载

[水晶报表]服务器后台自动生成PDF等档案

记得以前用JDE ERP的时候,通过过设置参数自动跑报表。 我现在两个设想:第一,邮件预警也可以采取附件形式,有些情况配合附件 第二,单据审批完后自动保存当时的一份PDF文档。 方法:搭载水晶报表实现...

财务报表自动生成

  • 2013-04-24 13:58
  • 538KB
  • 下载

框架技术--S2SH框架整合(使用myeclipse自动生成)

简单在这里通过图片记录下通过Myeclipse自动生成Struts2+spring+hibernate的步骤。   1、首先创建一个项目,邮件项目名,选择MyEclipse选项,会展示一个出一块有Ad...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)