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()方法。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值