birt转载真的可用

http://fanli7.net/a/JAVAbiancheng/ANT/20121201/263620.html


BIRT簡單實例

時間:2012-12-01 13:34 來源:Internet  作者:Internet  點擊: 253 次
http://go.rritw.com/www.360doc.com/content/10/1109/19/3715754_68004729.shtml BIRT是一個Eclipse-based開放
http://go.rritw.com/www.360doc.com/content/10/1109/19/3715754_68004729.shtml 

BIRT是一個Eclipse-based開放源代碼報表系統。它主要是用在基於Java與J2EE的Web應用程序上。BIRT主要由兩部分組成:一個是基於Eclipse的報表設計和一個可以加到你應用服務的運行期組件。BIRT同時也提供一個圖形報表制作引擎。 

Birt Home :http://go.rritw.com/www.eclipse.org/birt/phoenix/ 
Birt環境及下載:[url]http://download.eclipse.org/birt/downloads [/url] 
Birt教程:http://go.rritw.com/www.eclipse.org/birt/phoenix/tutorial/ 
eclipse技術論壇:[url]http://www.eclipseworld.org/bbs/ [/url] 
Birt例子演示:[url]http://go.rritw.com/www.eclipse.org/birt/phoenix/examples/ [/url] 
                    [url]http://download3.eclipse.org/birt/downloads/examples/misc/BIRT/BIRT_demo_Camv3.html [/url] 
                    [url]http://download3.eclipse.org/birt/downloads/demos/MyFirstReport.html [/url] 



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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 
out.println("<HTML>"); 
out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
out.println("  <BODY>"); 
out.println(" Post does nothing"); 
out.println("  </BODY>"); 
out.println("</HTML>"); 
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.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 = "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 
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> 
<html> 
  <head> 
  </head> 
  
  <body> 
    <form name="myform" action="./webReport" method="get"> 
    <table> 
    <tr> 
    <td>報表名稱(帶後綴名)</td> 
    <td><input name="ReportName" type="text"></td> 
    <td><button type="submit">查看</button></td> 
    </tr> 
    </table> 
    </form> 
  </body> 
</html> 

9.    修改web.xml文件如下 
<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.4" 
    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"> 
  <servlet> 
    <servlet-name>WebReport</servlet-name> 
    <servlet-class>com.lisa.WebReport</servlet-class> 
  </servlet> 
  <servlet-mapping> 
    <servlet-name>WebReport</servlet-name> 
    <url-pattern>/webReport</url-pattern> 
  </servlet-mapping> 
</web-app> 



参看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:
<Connector port="8080" 
               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"); 
<a href="../birt/frameset?__report=privilegerpt.rptdesign¶m=<%=param%>">查看</a> 
即ok. 
From:ITEYE


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值