BIRT報表一線揭祕2

收到不少人的郵件諮詢我能否直接用JAVA設計報表然後直接展示出來,而非運行導出或者生成一個文件,畢竟生成或者導出的文件不是在服務器端就是要客戶瀏覽器接收,不算友好。其實這並非難事,只需把生成的設計文檔放在服務器端然後又直接用webviewer打開便是。代碼如下:
  1. import java.io.IOException;  
  2. import javax.servlet.ServletException;  
  3. import javax.servlet.annotation.WebServlet;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import org.eclipse.birt.core.framework.Platform;  
  9. import org.eclipse.birt.report.model.api.CellHandle;  
  10. import org.eclipse.birt.report.model.api.DesignConfig;  
  11. import org.eclipse.birt.report.model.api.DesignElementHandle;  
  12. import org.eclipse.birt.report.model.api.ElementFactory;  
  13. import org.eclipse.birt.report.model.api.GridHandle;  
  14. import org.eclipse.birt.report.model.api.IDesignEngine;  
  15. import org.eclipse.birt.report.model.api.IDesignEngineFactory;  
  16. import org.eclipse.birt.report.model.api.ImageHandle;  
  17. import org.eclipse.birt.report.model.api.LabelHandle;  
  18. import org.eclipse.birt.report.model.api.ReportDesignHandle;  
  19. import org.eclipse.birt.report.model.api.RowHandle;  
  20. import org.eclipse.birt.report.model.api.SessionHandle;  
  21. import org.eclipse.birt.report.model.api.activity.SemanticException;  
  22.   
  23. import com.ibm.icu.util.ULocale;  
  24.   
  25. @WebServlet("/SimpleCreate")  
  26. public class SimpleCreate extends HttpServlet {  
  27.     private static final long serialVersionUID = 1L;  
  28.   
  29.     public SimpleCreate() {  
  30.         super();  
  31.     }  
  32.   
  33.     protected void doGet(HttpServletRequest request,  
  34.             HttpServletResponse response) throws ServletException, IOException {  
  35.         try  
  36.            {  
  37.                buildReport(request, response);  
  38.            }  
  39.            catch( IOException e )  
  40.            {  
  41.                e.printStackTrace();  
  42.            }  
  43.            catch( SemanticException e )  
  44.            {  
  45.                e.printStackTrace();  
  46.            }  
  47.     }  
  48.   
  49.       
  50.     protected void doPost(HttpServletRequest request,  
  51.             HttpServletResponse response) throws ServletException, IOException {  
  52.         try  
  53.            {  
  54.                buildReport(request, response);  
  55.            }  
  56.            catch( IOException e )  
  57.            {  
  58.                e.printStackTrace();  
  59.            }  
  60.            catch( SemanticException e )  
  61.            {  
  62.                e.printStackTrace();  
  63.            }  
  64.   
  65.     }  
  66.   
  67.     static void buildReport(HttpServletRequest request,  
  68.             HttpServletResponse response) throws IOException, SemanticException {  
  69.         DesignConfig config = new DesignConfig();  
  70.   
  71.         //config.setProperty("BIRT_HOME","D:\\Develop Install Files\\birt-runtime-4_2_1\\ReportEngine");  
  72.         IDesignEngine engine = null;  
  73.         try {  
  74.             Platform.startup(config);  
  75.             IDesignEngineFactory factory = (IDesignEngineFactory) Platform  
  76.                     .createFactoryObject(IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY);  
  77.             engine = factory.createDesignEngine(config);  
  78.         } catch (Exception ex) {  
  79.             ex.printStackTrace();  
  80.         }  
  81.   
  82.         SessionHandle session = engine.newSessionHandle(ULocale.ENGLISH);  
  83.         ReportDesignHandle design = session.createDesign();  
  84.         ElementFactory efactory = design.getElementFactory();  
  85.         DesignElementHandle element = efactory  
  86.                 .newSimpleMasterPage("Page Master");  
  87.         design.getMasterPages().add(element);  
  88.         GridHandle grid = efactory.newGridItem(null2 /* cols */1 /* row */);  
  89.         design.getBody().add(grid);  
  90.         grid.setWidth("100%");  
  91.           
  92.         //在行加入一個圖片  
  93.         RowHandle row = (RowHandle) grid.getRows().get(0);  
  94.         ImageHandle image = efactory.newImage(null);  
  95.         CellHandle cell = (CellHandle) row.getCells().get(0);  
  96.         cell.getContent().add(image);  
  97.         image.setURL("\"https://img-my.csdn.net/uploads/201301/09/1357690895_3463.png\"");  
  98.   
  99.         // 產生一個標籤  
  100.         LabelHandle label = efactory.newLabel(null);  
  101.         cell = (CellHandle) row.getCells().get(1);  
  102.         cell.getContent().add(label);  
  103.         label.setText("測試,用Java生成報表並用報表展示器展示報表");  
  104.   
  105.         // 保存報表  
  106.         String path=request.getSession().getServletContext().getRealPath("/");  
  107.         System.out.println(path);  
  108.         design.saveAs(path+"/sample.rptdesign");  
  109.         design.close();  
  110.           
  111.         //用報表展示器打開報表  
  112.         String reportpath=request.getContextPath();  
  113.         System.out.println(reportpath);  
  114.         response.sendRedirect(reportpath+"/frameset?__report=sample.rptdesign");          
  115.         System.out.println("Finished");  
  116.     }  
  117.   
  118. }  

關鍵的是最後幾步:

保存報表

String path=request.getSession().getServletContext().getRealPath("/");
design.saveAs(path+"/sample.rptdesign");
展示報表

String reportpath=request.getContextPath();
response.sendRedirect(reportpath+"/frameset?__report=sample.rptdesign");

這個servlet運行並直接生成了一個報表sample.rptdesign,並通過報表展示器查看報表

需要在web.xml中加入如下的配置:

<servlet>

<servlet-name>SimpleCreate</servlet-name>

<servlet-class>birt.SimpleCreate</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>SimpleCreate</servlet-name>

<url-pattern>/SimpleCreate</url-pattern>

</servlet-mapping>

我們把他發佈到WebViewerExample工程下,訪問http://localhost:8080/WebViewerExample/SimpleCreate,控制檯會打印出程序中的輸出

D:\apache-tomcat-7.0.33\webapps\WebViewerExample\

/WebViewerExample

Finished

注意地址欄上的地址信息是http://localhost:8080/WebViewerExample/frameset?__report=sample.rptdesign,是因爲我們在程序中用的response.sendRedirect()方法。



發佈了57 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章