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
|