起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28142|回复: 7

手动生成报表

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2013-3-22 15:45:21 | 显示全部楼层 |阅读模式
目的:平台中的报表是每次显示的时候生成的,如果希望生成报表和显示报表分开,可以这样实现:生成报表时,一次性将报表对应的html、doc、xls、pdf等4个文件生成并保存到服务器的某个目录中;显示报表、导出报表时直接下载这4个文件的其中一个到本地即可。平台使用了生成一个临时文件,并下载到本地的做法,我们可以效仿这个做法。

平台报表组件在显示报表、打印报表、导出报表时使用了下面两个java文件
/UI/system/service/report/dsrc/ReportBrowse.java
/UI/system/service/report/dsrc/PrintGetFile.java
主要修改ReportBrowse.java 文件的doPost方法

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-3-22 15:47:10 | 显示全部楼层
生成4个报表对应的文件,代码如下
  1.         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.         ……
  3.                 createReportFile(reportJSONHelper, "xhtml", fileDir + "/" + reportName + ".xhtml");
  4.                 createReportFile(reportJSONHelper, "doc", fileDir + "/" + reportName + ".doc");
  5.                 createReportFile(reportJSONHelper, "xls", fileDir + "/" + reportName + ".xls");
  6.                 createReportFile(reportJSONHelper, "pdf", fileDir + "/" + reportName + ".pdf");
  7.         ……
  8.         }        

  9.         private void createReportFile(ReportJSONHelper reportJSONHelper, String outputType, String fullfilename) throws ServletException, IOException {
  10.                 try {
  11.                         String url = createReportURL(REPORT_SERVER, businessCookie);
  12.                         Element requestE = reportJSONHelper.execute(outputType);
  13.                         //请求报表服务器,生成报表
  14.                         byte[] cacheByte = call(url, requestE.asXML());

  15.                         //存为文件
  16.                         File reportFile = new File(fullfilename);
  17.                         FileOutputStream fileOutputStream = new FileOutputStream(reportFile, false);
  18.                         if ("xhtml".equals(outputType)) {
  19.                                 cacheByte = new String(cacheByte).replace("xhtml:", "").getBytes();
  20.                         }
  21.                         ByteArrayInputStream in = new ByteArrayInputStream(cacheByte);
  22.                         byte[] bs = new byte[1024];
  23.                         int i = -1;
  24.                         while ((i = in.read(bs)) != -1) {
  25.                                 fileOutputStream.write(bs, 0, i);
  26.                         }
  27.                         fileOutputStream.flush();
  28.                         fileOutputStream.close();
  29.                 } catch (Exception e) {
  30.                         throw new ServletException("报表服务请求失败", e);
  31.                 }
  32.         }        
复制代码


这里有个中文文件名的问题,如果使用中文文件名,需要进行一次utf-8编码
  1.                 filenameEncode = java.net.URLEncoder.encode(reportName, "utf-8") + "." + outputType;
复制代码
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-3-22 15:48:55 | 显示全部楼层
下载报表文件,其中打印报表是比较特殊的
  1.         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.         ……
  3.                         String uiServerURL = tempUrl.substring(0, tempUrl.indexOf("/UI/"));
  4.                         ReportJSONHelper reportJSONHelper = new ReportJSONHelper(jsonString, (String) businessCookie, uiServerURL, REPORT_SERVER);
  5.                         String outputType = reportJSONHelper.getOutputType();                ……
  6.         //将报表文件传回界面
  7.                 if ("print".equals(outputType)) {
  8.                         PrintWriter pw = response.getWriter();
  9.                         pw.print("<object id='pdf' type='application/pdf' width='100' height='100'>" +
  10.                                         "<param name='src' fmt:url-type='action' value='"+uiServerURL+"/UI/system/service/report/printGetFile.j?filename="
  11.                                         + fileDir + "/" + filenameEncode+"' />" +
  12.                                         "</object>" +
  13.                                         "<script type='text/javascript'>" +
  14.                                         "document.pdf.printWithDialog();" +
  15.                                         "document.pdf.focus();" +
  16.                                         "</script>" +
  17.                                         "");
  18.                         pw.flush();
  19.                         pw.close();
  20.                 } else {
  21.                         FileInputStream inputStream = new FileInputStream(reportFile);
  22.                         response.setCharacterEncoding("UTF-8");
  23.                        
  24.                         if ("xhtml".equals(outputType)) {
  25.                                 response.setHeader("Cache-Control", "no-cache");
  26.                                 response.setHeader("Content-Type", "text/html");
  27.                         } else if ("doc".equals(outputType)) {
  28.                                 response.setHeader("Cache-Control", "no-cache");
  29.                                 response.setHeader("Content-Type", "application/ms-word");
  30.                                 response.addHeader("Content-disposition", "attachment;filename="" + filenamedownload + """);
  31.                         } else if ("xls".equals(outputType)) {
  32.                                 response.setHeader("Cache-Control", "no-cache");
  33.                                 response.setHeader("Content-Type", "application/ms-excel");
  34.                                 response.addHeader("Content-disposition", "attachment;filename="" + filenamedownload + """);
  35.                         } else if ("preview".equals(outputType)) {
  36.                                 response.setHeader("Content-Type", "application/pdf");
  37.                                 response.addHeader("Content-disposition", "inline;filename="" + filenamedownload + """);
  38.                         } else {
  39.                                 response.setHeader("Cache-Control", "no-cache");
  40.                                 response.setHeader("Content-Type", "application/pdf");
  41.                                 response.addHeader("Content-disposition", "attachment;filename="" + filenamedownload + """);
  42.                         }
  43.                         OutputStream out = response.getOutputStream();
  44.                         byte[] bt = new byte[1024];
  45.                         int i = -1;
  46.                         while ((i = inputStream.read(bt)) != -1) {
  47.                                 out.write(bt, 0, i);
  48.                         }
  49.                         out.flush();
  50.                         out.close();
  51.                 }
  52.         ……
  53.         }       
复制代码
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-3-22 15:51:08 | 显示全部楼层

一个简单的案例

说明:
1、  案例实现了一种简单的方式,即当没有生成过报表时,则生成报表,否则显示报表。这样的改动最小。
2、  如果希望生成报表和显示报表完全分开,需要给report组件增加一个方法,可以仿照refresh方法写,再仿照ReportBrowse.j写一个.j文件来实现,
3、  案例中对report组件id等于grid的报表进行了单独处理,会将报表相关的4个文件一次生成,以后则会直接显示。关于生成的这4个文件的文件名取自报表组件中的reportName属性,这4个文件存放的目录暂时是tomcattemp目录,这个目录应该修改为一个合适的目录。
ReportBrowse.java代码如下
  1. public class ReportBrowse extends JProcessorImpl {
  2.         ……
  3.         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4.                 try {
  5.                         //初始化报表服务器地址(UIServer/justep.xml)
  6.                         init(request);
  7.                         businessCookie = getBusinessSessionID(request).toString();

  8.                         String tempUrl = request.getRequestURL().toString();
  9.                         String uiServerURL = tempUrl.substring(0, tempUrl.indexOf("/UI/"));
  10.                         String jsonString = getRequestJSONString(request);

  11.                         // rdl和json的数据整合,(sql与页面设置)
  12.                         ReportJSONHelper reportJSONHelper = new ReportJSONHelper(jsonString, (String) businessCookie, uiServerURL, REPORT_SERVER);
  13.                         Element requestE = reportJSONHelper.execute(null);
  14.                         String outputType = reportJSONHelper.getOutputType();
  15.                         String reportName = reportJSONHelper.getReportName();
  16.                         String reportID = reportJSONHelper.getReportID();

  17.                         String fileDir;
  18.                         String filename;
  19.                         String filenameEncode;
  20.                         String filenamedownload;
  21.                         if ("grid".equals(reportID)) {//只有报表组件的ID是grid的报表生成指定名称的报表文件
  22.                                 fileDir = System.getProperty("java.io.tmpdir");//需要保存的报表文件,应该放到其它目录中
  23.                                 //用reportName生成文件名
  24.                                 filename = reportName + "." + outputType;
  25.                                 filenameEncode = java.net.URLEncoder.encode(reportName, "utf-8") + "." + outputType;
  26.                                 if ("preview".equals(outputType) || "print".equals(outputType)) {
  27.                                         filename = reportName + ".pdf";
  28.                                         filenameEncode = java.net.URLEncoder.encode(reportName, "utf-8") + ".pdf";
  29.                                 }
  30.                                 filenamedownload = filename;
  31.                         }
  32.                         else{//其它报表用GUID作为文件名
  33.                                 fileDir = System.getProperty("java.io.tmpdir");
  34.                                 filename = java.util.UUID.randomUUID().toString();
  35.                                 if ("preview".equals(outputType) || "print".equals(outputType)) {
  36.                                         filename = filename + ".pdf";
  37.                                         filenamedownload = reportName + ".pdf";
  38.                                 }else{
  39.                                         filename = filename + "." + outputType;
  40.                                         filenamedownload = reportName + "." + outputType;;
  41.                                 }
  42.                                 filenameEncode = filename;
  43.                         }
  44.                         String fullFileName = fileDir + "/" + filename;
  45.                         File reportFile = new File(fullFileName);
  46.                        
  47.                         if ("grid".equals(reportID)) {//只有报表组件的ID是grid的报表才一次生成4个文件
  48.                                 if (!reportFile.exists()) {//如果文件不存在则生成4个报表文件
  49.                                         createReportFile(reportJSONHelper, "xhtml", fileDir + "/" + reportName + ".xhtml");
  50.                                         createReportFile(reportJSONHelper, "doc", fileDir + "/" + reportName + ".doc");
  51.                                         createReportFile(reportJSONHelper, "xls", fileDir + "/" + reportName + ".xls");
  52.                                         createReportFile(reportJSONHelper, "pdf", fileDir + "/" + reportName + ".pdf");
  53.                                 }
  54.                         }else{
  55.                                 if ("preview".equals(outputType) || "print".equals(outputType)) {
  56.                                         createReportFile(reportJSONHelper, "pdf", fullFileName);
  57.                                 }else{
  58.                                         createReportFile(reportJSONHelper, outputType, fullFileName);
  59.                                 }
  60.                         }
  61.                         //将报表文件传回界面
  62.                         if ("print".equals(outputType)) {
  63.                                 PrintWriter pw = response.getWriter();
  64.                                 pw.print("<object id='pdf' type='application/pdf' width='100' height='100'>" +
  65.                                                 "<param name='src' fmt:url-type='action' value='"+uiServerURL+"/UI/system/service/report/printGetFile.j?filename="
  66.                                                 + fileDir + "/" + filenameEncode+"' />" +
  67.                                                 "</object>" +
  68.                                                 "<script type='text/javascript'>" +
  69.                                                 "document.pdf.printWithDialog();" +
  70.                                                 "document.pdf.focus();" +
  71.                                                 "</script>" +
  72.                                                 "");
  73.                                 pw.flush();
  74.                                 pw.close();
  75.                         } else {
  76.                                 FileInputStream inputStream = new FileInputStream(reportFile);
  77.                                 response.setCharacterEncoding("UTF-8");
  78.                                
  79.                                 if ("xhtml".equals(outputType)) {
  80.                                         response.setHeader("Cache-Control", "no-cache");
  81.                                         response.setHeader("Content-Type", "text/html");
  82.                                 } else if ("doc".equals(outputType)) {
  83.                                         response.setHeader("Cache-Control", "no-cache");
  84.                                         response.setHeader("Content-Type", "application/ms-word");
  85.                                         response.addHeader("Content-disposition", "attachment;filename="" + filenamedownload + """);
  86.                                 } else if ("xls".equals(outputType)) {
  87.                                         response.setHeader("Cache-Control", "no-cache");
  88.                                         response.setHeader("Content-Type", "application/ms-excel");
  89.                                         response.addHeader("Content-disposition", "attachment;filename="" + filenamedownload + """);
  90.                                 } else if ("preview".equals(outputType)) {
  91.                                         response.setHeader("Content-Type", "application/pdf");
  92.                                         response.addHeader("Content-disposition", "inline;filename="" + filenamedownload + """);
  93.                                 } else {
  94.                                         response.setHeader("Cache-Control", "no-cache");
  95.                                         response.setHeader("Content-Type", "application/pdf");
  96.                                         response.addHeader("Content-disposition", "attachment;filename="" + filenamedownload + """);
  97.                                 }
  98.                                 OutputStream out = response.getOutputStream();
  99.                                 byte[] bt = new byte[1024];
  100.                                 int i = -1;
  101.                                 while ((i = inputStream.read(bt)) != -1) {
  102.                                         out.write(bt, 0, i);
  103.                                 }
  104.                                 out.flush();
  105.                                 out.close();
  106.                         }

  107.                 } catch (Exception e) {
  108.                         throw new ServletException("报表服务请求失败", e);
  109.                 }
  110.         }
  111.         ……
  112. }
复制代码


PrintGetFile.java代码如下
  1. public class PrintGetFile extends JProcessor {
  2.         protected void doGet(HttpServletRequest request, HttpServletResponse response)
  3.                         throws ServletException, IOException {
  4.                 String filename = request.getParameter("filename");
  5.                 if(filename.indexOf("/") == -1)
  6.                         filename = System.getProperty("java.io.tmpdir") + "/" + filename;
  7.                 OutputStream out = null;
  8.                 try{
  9.                         File reportFile = new File(filename);       
  10.                         FileInputStream inputStream = new FileInputStream(reportFile);
  11.                         out = response.getOutputStream();
  12.                         byte[] bt = new byte[1024];
  13.                         int i = -1;
  14.                         while((i = inputStream.read(bt)) != -1){
  15.                                 out.write(bt, 0, i);
  16.                         }
  17.                         out.flush();                       
  18.                 }finally{
  19.                         out.close();
  20.                 }
  21.         }
  22. }
复制代码
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

19

主题

57

帖子

121

积分

初级会员

Rank: 2

积分
121
QQ
发表于 2013-3-24 14:47:29 | 显示全部楼层
谢谢管理员

19

主题

57

帖子

121

积分

初级会员

Rank: 2

积分
121
QQ
发表于 2013-3-25 10:23:25 | 显示全部楼层
这种方式是以报表名称为标识,如果多个用户请求相同报表,是否会后请求的会覆盖先请求的报表

242

主题

1418

帖子

2325

积分

金牌会员

批判主义者

Rank: 6Rank: 6

积分
2325
QQ
发表于 2015-10-23 16:30:25 | 显示全部楼层
本帖最后由 腹部流出的肉 于 2015-10-23 16:32 编辑
zhaixin 发表于 2013-3-22 15:47
生成4个报表对应的文件,代码如下

这里有个中文文件名的问题,如果使用中文文件名,需要进行一次utf-8编码 ...

BeX5.3.1中创建文件也是这样的吗 我试了好多次都不行



在线等
在线等
在线等
如果我说对了 请别忘记点赞.

53

主题

313

帖子

1134

积分

金牌会员

Rank: 6Rank: 6

积分
1134
QQ
发表于 2020-2-26 14:16:35 | 显示全部楼层
好牛的帖子!
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-27 03:59 , Processed in 0.058289 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表