`
jiava9900
  • 浏览: 86739 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

BIRT教程及资料

    博客分类:
  • java
阅读更多
    以前很少做报表, 项目中的有报表的需求,暂时还只能用了一些简单的css,js,控制,不过功能很有限.
收集一下资料.做了一个简单的, 但应用到项目中,还要断续学习一下.

birt是一个eclipse-based开放源代码报表系统。它主要是用在基于java与j2ee的web应用程序上。birt主要由两部分组成:一个是基于eclipse的报表设计和一个可以加到你应用服务的运行期组件。birt同时也提供一个图形报表制作引擎。

birt home :http://www.eclipse.org/birt/phoenix/
birt环境及下载:http://download.eclipse.org/birt/downloads
birt教程:http://www.eclipse.org/birt/phoenix/tutorial/
eclipse技术论坛:http://www.eclipseworld.org/bbs/
birt例子演示:http://www.eclipse.org/birt/phoenix/examples/
http://download3.eclipse.org/birt/downloads/examples/misc/birt/birt_demo_camv3.html
http://download3.eclipse.org/birt/downloads/demos/myfirstreport.html

birt使用小结
ide: birt-report-designer-all-in-one-2.1.2 (建议初学者下载,下载后是一个eclipse,birt已经装好了,方便)
runtime:birt-runtime-2.1.2
jdk: jdk1.5.0_02

和现有项目有两种结合方式。
其一:直接使用birt_runtime_2.1.2中的webviewerexample。
1. 将其发布到c:\jakarta-tomcat-5.0.28\webapps目录下,并将其更改名称为birtapp。
2. 在birtapp \web-inf\platform\plugins\com.lowagie.itext目录下新建文件夹lib,并将itext-1.3.jar和itextasian.jar拷入其中。
3. 将已完成的报表,比如test.rptdesign放到birtapp的根目录下,即可通过
http://localhost:8080/birt/frameset?__report=test.rptdesign(相对路径)
或者
http://localhost:8080/birt/frameset?__report=c:/jakarta-tomcat-5.0.28/webapps/birt/test.rptdesign(绝对路径)
来访问。
若报表设置以后参数,则只需在上述url后拼接参数及值即可。
eg: http://localhost:8080/birt/frameset?__report=test.rptdesign&sample=my+parameter
其二:在我们的程序中使用birt提供的report engine api来调用报表并展现报表。
1. 新建web项目webrpt。
2. 在webrpt的web模块下的web-inf目录中新建文件夹lib,并将birt-runtime-2_1_2\reportengine\lib下的所有文件拷入其中。
3. 如上,同样在web-inf目录中新建文件夹platform,并将birt-runtime-2_1_2\reportengine下的plugins和configuration拷入其中。
4. 将itext-1.3.jar和itextasian.jar拷入platform\plugins\com.lowagie.itext文件夹的lib目录中(此处如果没有该目录,新建之),亦或者将所述jar包拷入web-inf\lib目录下也可。
5. 在webrpt的web模块的根目录下新建images和reports文件夹。其中reports文件夹中放
已开发完成的报表文件。
6. 当然所使用的数据库驱动也要放在lib文件夹下。
7. 使用report engine api开发调用及展示报表的相关程序。代码如下:
webreport.java
package com.lisa;

import java.io.ioexception;
import java.io.printwriter;
import java.util.hashmap;
import java.util.logging.level;
import java.util.logging.logger;

import javax.servlet.servletcontext;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

import org.eclipse.birt.report.engine.api.engineconstants;
import org.eclipse.birt.report.engine.api.htmlrendercontext;
import org.eclipse.birt.report.engine.api.htmlrenderoption;
import org.eclipse.birt.report.engine.api.ireportrunnable;
import org.eclipse.birt.report.engine.api.irunandrendertask;
import org.eclipse.birt.report.engine.api.ireportengine;

public class webreport extends httpservlet {

/**
*
*/
private static final long serialversionuid = 1l;
/**
* constructor of the object.
*/
private ireportengine birtreportengine = null;
protected static logger logger = logger.getlogger( “org.eclipse.birt” );

public webreport() {
super();
}

/**
* destruction of the servlet.
*/
public void destroy() {
super.destroy();
birtengine.destroybirtengine();
}

/**
* the doget method of the servlet.
*
*/
public void doget(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception {
system.out.println(”doget…………….”);

//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 = req.getparameter(”reportname”);
system.out.println(”reportname:::”+reportname);
servletcontext sc = req.getsession().getservletcontext();
this.birtreportengine = birtengine.getbirtengine(sc);

//setup image directory
htmlrendercontext rendercontext = new htmlrendercontext();
rendercontext.setbaseimageurl(req.getcontextpath()+”/images”);
rendercontext.setimagedirectory(sc.getrealpath(”/images”));

logger.log( level.fine, “image directory ” + sc.getrealpath(”/images”));
system.out.println(”stdout image directory ” + sc.getrealpath(”/images”));

hashmap contextmap = new hashmap();
contextmap.put( engineconstants.appcontext_html_render_context, rendercontext );

ireportrunnable design;
try
{
//open report design
design = birtreportengine.openreportdesign( sc.getrealpath(”/reports”)+”/”+reportname );
//create task to run and render report
irunandrendertask task = birtreportengine.createrunandrendertask( design );
task.setappcontext( contextmap );

hashmap parammap=new hashmap();
parammap.put(”param”,”%”);
parammap.put(”sample”, “lisa ok”);

task.setparametervalues(parammap);

//set output options
htmlrenderoption options = new htmlrenderoption();
//options.setoutputformat(htmlrenderoption.output_format_html);
options.setoutputformat(htmlrenderoption.output_format_pdf);
options.setoutputstream(resp.getoutputstream());
task.setrenderoption(options);

//run report
task.run();
task.close();
}catch (exception e){

e.printstacktrace();
throw new servletexception( e );
}
}

/**
* the dopost method of the servlet.
*
*/
public void dopost(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {

response.setcontenttype(”text/html”);
printwriter out = response.getwriter();
out.println(”“);
out.println(”“);
out.println(” “);
out.println(” “);
out.println(” post does nothing”);
out.println(” “);
out.println(”“);
out.flush();
out.close();
}

/**
* initialization of the servlet.
*
* @throws servletexception if an error occure
*/
public void init() throws servletexception {
system.out.println(”init……………….”);
birtengine.initbirtconfig();

}

}

birtengine.java
package com.lisa;

import java.io.inputstream;
import java.io.ioexception;
import java.util.properties;
import java.util.logging.level;

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.platformse
rvletcontext;
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 = “com/lisa/birtconfig.properties”;

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);
}

config.setenginehome(”");
iplatformcontext context = new platformservletcontext( sc );
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() {
system.out.println(”loadengineprops…………………”);
try {
//config file must be in classpath
classloader cl = thread.currentthread ().getcontextclassloader();
inputstream in = null;
in = cl.getresourceasstream (configfile);
configprops.load(in);
in.close();

} catch (ioexception e) {
e.printstacktrace();
}

}

}
birtconfig.properties
logdirectory=c:/temp
loglevel=finest

8. 通过web页面输入要访问的报表名称,并提交到处理请求的相关servlet.
test.jsp










报表名称(带后缀名)
查看








9. 修改web.xml文件如下

xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/xmlschema-instance”
xsi:schemalocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>

webreport
com.lisa.webreport


webreport
/webreport



参看servlet example.

另:一些在论坛里学到得很实用的小技巧,谢谢提供的作者们:)
分页(vii779):
2.1以后,只能按照分组分页,想要按每页固定记录数来分页比较困难。
论坛中已经介绍过通过分组的方式,加一个分页字段来实现分页功能。
但该方式操作起来稍显繁琐 。
通过script方式,可以实现更简单的分页方式。
首先加一个表格,选中表格中的明细行,切换到script标签页。
在onrender事件中加入以下代码
rownum = number(this.getrowdata().getexpressionvalue(’row["0"]‘))+1;
if(rownum % 20 ==0){
this.getstyle().pagebreakafter=”always”;
}else{
this.getstyle().pagebreakafter=null;
}
这样就实现了按每页20条记录的分页功能。
需要注意的是,在run方式下,看不到分页效果,打印预览时才能看到分页。
在framest(ctrl+shift+b)方式下,可以看到完整的分页效果。

纸张(paddycq):
主页—>常规 中设置方向、类型

pdf中文乱码(mmwy):
放了itext-1.3.jar、itextasian.jar两个jar包在\plugins\com.lowagie.itext\lib目录下,一切ok,从来没有出现过中文问题。就连部署到linux下也是如此。

url乱码问题.mht
两种解决方法:
一. java.net.urldecoder.decode(java.net.urlencoder.encode(”中文”));
二.如果使用tomcat做web应用服务器,则修改server.xml文件,在connector元素中增加属性uriencoding.
eg: maxthreads=”150″ minsparethreads=”25″ maxsparethreads=”75″
enablelookups=”false” redirectport=”8443″ acceptcount=”100″
debug=”0″ connectiontimeout=”20000″
disableuploadtimeout=”true”
uriencoding=”gb2312″/>
前提:
1.使用eclipse提供的runtime viewer.
2.使用超链方式查看报表.
3.使用tomcat.

具体解决办法:
修改tomcat的server.xml文件,在connector元素中增加属性usebodyencodingforuri=”true”
并且,url中的中文参数必须事先转码.
eg:
string param=java.net.urlencoder.encode(”公用信息表”,”utf-8″);  
0
1
分享到:
评论

相关推荐

    flappybird游戏源码

    Unity版和Cocos2d-x版的源码可能包含更丰富的注释,这对于初学者来说是一份宝贵的教程资料。 总的来说,Flappy Bird游戏源码的学习可以让我们深入了解游戏开发的基本流程,体验从无到有的创造过程,同时也能提高...

    cocos2d-x for js flappybird 代码 资源

    7. **博文链接**:资源包提到有相关的博文联系,这意味着可能提供了详细的教程或解释,帮助新手理解代码的实现过程和背后的设计思路,这对于初学者来说是一份宝贵的参考资料。 通过学习和实践这个Flappy Bird的项目...

    微信小程序富文本解析,折线图,MD5,bluebird小程序源码(源码+源码导入视频教程+源码导入文档教程)小程序精选源码亲测可

    微信小程序是一种轻量级的应用开发平台,主要用于在微信内创建和运行各种互动体验。这个压缩包包含了一系列关于微信小程序开发的资源,特别...对于想要提升微信小程序开发能力的人来说,这是一个非常有价值的资料集合。

    FlappyBird (LabVIEW) 保姆教学.zip

    《FlappyBird (LabVIEW) 保姆教学》资源是一份专为编程爱好者和LabVIEW初学者准备的详尽教程,旨在教会用户如何使用LabVIEW这一强大的图形化编程语言来开发经典小游戏——FlappyBird。LabVIEW,全称Laboratory ...

    cocos2dx-flappyBird

    "cocos2dx-flappyBird"项目是一个使用Cocos2d-x框架开发的经典游戏Flappy Bird的源代码实现,对于想要学习和掌握Cocos2d-x引擎的开发者来说,这是一个非常有价值的参考资料。 Flappy Bird是一款简单但极具挑战性的...

    Python+pygame游戏25个案例及源码+pygame中文教程(注释详细 完美运行)

    Python pygame游戏25个案例及源码【425M】 1. 包括贪吃蛇、飞机大战、2048游戏、口红挑战游戏、拼图、打地鼠、坦克大战、滑雪、射击游戏、...4. 附带了pygame中文教程和一些资料,欢迎下载,有问题可以私信与我交流。

    SEO学习资料_SEO入门教程

    - 搜索引擎算法更新:如何应对Google的Panda、Penguin、Hummingbird等重大更新。 - 百度SEO的区别:对于国内用户,了解百度的SEO规则和谷歌有何不同。 - SEO工具使用:如Google Search Console、Ahrefs、SEMrush...

    Early bird 资源包

    "Early Bird"资源包是一个来自GitHub仓库的开源项目,由用户OiteBoys分享。这个资源包主要聚焦于提供早期采用者或者开发者所关注的工具、框架和学习资料,可能是为了帮助他们快速适应新技术和趋势。由于被打上了...

    微信小程序源码demo推荐:事项助手;引入兼容库Bluebird支持Promise28.zip

    在微信小程序开发中,"微信小...总之,这个压缩包提供了从基础到进阶的微信小程序开发实践,包括源码示例、Promise的使用以及官方开发工具的引导,对于想要提升小程序开发技能的开发者来说,是一份不可多得的学习资料。

    seo每日一帖笔记完整版 seo教程 seo教学资料

    9. **算法更新及趋势**:了解搜索引擎如Google的算法更新,如Panda、Penguin、Hummingbird等,以便及时调整优化策略。 下载说明.txt 可能提供了下载和阅读《SEO每日一贴笔记》完整版.pdf的具体步骤,或者包含了关于...

    Java2实用教程》课后习题参考答案(第三版).rar

    这份"Java2实用教程》课后习题参考答案(第三版).rar"压缩包提供了该书第三版的所有课后习题的详细解答,对于学习者来说是极有价值的参考资料。 在学习Java的过程中,掌握课后习题的解题方法能够巩固理论知识,提升...

    SEO搜索引擎排名秘笈(PDF)-王通seo教程

    本教程深入浅出地介绍了SEO的基本概念、重要性以及实战应用,对于互联网营销人员、网站管理员以及希望通过网络提升品牌曝光度的个人来说,是一份宝贵的参考资料。 首先,我们来了解SEO的基本概念。SEO是指通过优化...

    富文本解析,折线图,MD5,bluebird.zip

    "详细图文文档教程.pdf"提供了更详细的步骤指南,可能是关于整个项目的技术细节、功能实现方法和最佳实践的概述,这对于开发者来说是宝贵的参考资料。 最后,"【CSDN:小正太浩二】下载说明.txt"可能包含了关于项目...

    日常了解的资料\邮件服务器安装与配置 .rar北大青鸟技术教程

    邮件服务器不仅需要正确配置,客户端(如Outlook、Thunderbird等)也需要正确配置才能连接到服务器。这包括设置SMTP(Simple Mail Transfer Protocol,发送邮件)和IMAP(Internet Message Access Protocol,接收...

    新闻资讯行业-会议精灵源代码【含图文文档教程+源码导入教程+操作界面截图】

    【bluebird.zip】这个文件很可能是一个库或框架,Bluebird 是一个著名的JavaScript Promise库,它提供了一种更高效的方式来处理异步操作。在新闻资讯应用中,Promise的使用可以提高代码的可读性和维护性,尤其是在...

    曹鹏SEO视频教程-04.北美常用搜索引擎.rar

    "下载说明.txt"可能包含了观看或下载教程的步骤和注意事项,而"A5下载- 更全的站长资源平台.url"则是一个链接,指向一个提供更多站长资源和学习资料的网站。 学习《曹鹏SEO视频教程-04.北美常用搜索引擎》将有助于...

    thinkpad win7系统安装教程

    - **电子邮件等资料**:包括Outlook或Thunderbird等邮件客户端中的邮件、联系人信息等。 - **重要的图片、音乐或视频资料**:个人照片、音乐文件、视频文件等。 - **IE的收藏夹内容**:浏览器收藏夹中的网址链接...

    最经典的SEO教程

    "更多教程.txt"可能是额外的学习资源或补充资料,指引进一步深入学习SEO。 总之,SEO是一个持续学习和适应变化的过程。通过这本经典教程,你可以系统地了解并掌握这一领域的关键技巧,为提升网站的搜索引擎排名打下...

    少儿编程wedo2.0_24节课程_带教程和源码程序,非常详细

    第11节课bird-0901修订 第12节课-仿生机器人-青蛙 第13节课-仿生机器人-鳄鱼 第14节课-仿生机器人-大象 第15节课-投石机 第16节课-画弦波的羊 第17节课-小巨人 第18节课-Wedo+Spirograph万花尺 第19节课-Model+No.+A...

Global site tag (gtag.js) - Google Analytics