大数据量报表APPLET打印分页传输方案


1 . 问题概述
当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存溢出

为了解决这个问题我们提出了打印分页传输方案.


2 . 案例
南通烟草局


3. 解决思路
1、打印窗口显示时,先向服务器申请第一页,并显示第一页。
2、在预览窗口按下一页或最后页按钮时,如果此页还没有从服务器取过来,那么先将之取过来并显示。
3、在打印窗口中依然可以改变页面设置、分栏数、缩放打印等,让服务器重新分页,并传第一页来显示。
4、在按打印按钮时,弹出一个新窗口,此窗口中可以选择打印机、设置要打印的页、显示打印进度、停止打印或退出。


 为了避免内存溢出,采取每5页为一个打印单位发送给打印机,这5页打印完后就将从内存中清除。以此类推.

4. 配置说明
实现:
1、在web.xml中配置后台分页传输的服务,如下
<servlet>
<servlet-name>com.runqian.report4.view.PagedPrint</servlet-name>
<servlet-class>com.runqian.report4.view.PagedPrint</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>com.runqian.report4.view.PagedPrint</servlet-name>
<url-pattern>/servlet/pagedPrintServer</url-pattern>
</servlet-mapping>


2、htmlTag中增加一个属性
serverPagedPrint="yes"
applet打印时是否采用服务器分页后再按页传输的方式,值为yes或no。一般大数据量的报表采用此方式

5. 程序说明

package com.runqian.report4.view;

 

import com.runqian.report4.cache.PagerCache;

import com.runqian.report4.cache.ReportCache;

import com.runqian.report4.cache.ReportEntry;

import com.runqian.report4.control.PageRequest;

import com.runqian.report4.control.PageResponse;

import com.runqian.report4.usermodel.Context;

import com.runqian.report4.usermodel.DataSetMetaData;

import com.runqian.report4.usermodel.IReport;

import com.runqian.report4.usermodel.PagerInfo;

import com.runqian.report4.usermodel.PrintSetup;

import com.runqian.report4.util.ReportParser;

import com.runqian.report4.util.ReportUtils2;

import java.awt.print.PageFormat;

import java.awt.print.Paper;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import javax.servlet.GenericServlet;

import javax.servlet.ServletException;

import javax.servlet.ServletInputStream;

import javax.servlet.ServletOutputStream;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class PagedPrint extends HttpServlet

{

  private PageFormat _$1(double paramDouble, PageFormat paramPageFormat)

  {

    PageFormat localPageFormat = new PageFormat();

    Paper localPaper1 = new Paper();

    Paper localPaper2 = paramPageFormat.getPaper();

    localPaper1.setSize(localPaper2.getWidth() * paramDouble, localPaper2.getHeight() * paramDouble);

    double d1 = localPaper2.getImageableX() * paramDouble;

    double d2 = localPaper2.getImageableY() * paramDouble;

    double d3 = localPaper2.getImageableWidth() * paramDouble;

    double d4 = localPaper2.getImageableHeight() * paramDouble;

    localPaper1.setImageableArea(d1, d2, d3, d4);

    localPageFormat.setPaper(localPaper1);

    localPageFormat.setOrientation(paramPageFormat.getOrientation());

    return localPageFormat;

  }

 

  private void _$1(IReport paramIReport) {

    if (paramIReport == null) return;

    try {

      paramIReport.getDataSetMetaData().clear();

 

      return;

    }

    catch (Throwable localThrowable)

    {

    }

  }

 

  public void service(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)

    throws ServletException, IOException

  {

    Object localObject3;

    ServletInputStream localServletInputStream = null;

    ServletOutputStream localServletOutputStream = null;

    ObjectOutputStream localObjectOutputStream = null;

    PageResponse localPageResponse = new PageResponse();

    try {

      try { IReport localIReport;

        PageFormat localPageFormat1;

        PageFormat localPageFormat2;

        PagerInfo localPagerInfo;

        int i;

        Object localObject4;

        int j;

        int k;

        localObject3 = getServletContext();

        localServletInputStream = paramHttpServletRequest.getInputStream();

        ObjectInputStream localObjectInputStream = new ObjectInputStream(localServletInputStream);

        localServletOutputStream = paramHttpServletResponse.getOutputStream();

        localObjectOutputStream = new ObjectOutputStream(localServletOutputStream);

        PageRequest localPageRequest = (PageRequest)localObjectInputStream.readObject();

        Context localContext = new Context();

        ReportEntry localReportEntry = ReportUtils2.getReportEntry(localPageRequest.fileName, localPageRequest.srcType, paramHttpServletRequest, localContext);

        ReportCache localReportCache = null;

 

        if ((

          localReportCache = localReportEntry.getReportCache(localPageRequest.cachedId)) == null)

        {

          if (localPageRequest.reportParamsId != null)

            ReportUtils2.putParamMacro2Context(localReportEntry.getReportDefine(), localPageRequest.reportParamsId, localContext, paramHttpServletRequest);

 

          localReportCache = localReportEntry.getReportCache(localContext, -1L);

        }

        localPageResponse.cachedId = localReportCache.getId();

 

        PrintSetup localPrintSetup = (

          localIReport = localReportCache.getReport())

          .getPrintSetup();

 

        switch (localPageRequest.action)

        {

        case 1:

          localPagerInfo = new PagerInfo(localPrintSetup);

          localPageFormat1 = localPrintSetup.getPageFormat();

 

          if ((

            i = localPrintSetup.getZoomMode()) ==

            1) {

            localPageFormat2 = localPageFormat1;

            localPageResponse.shrinkScale = 1.0D;

          }

          else if (i == 5) {

            localPageResponse.shrinkScale = (localPrintSetup.getZoomScale() / 100);

            localPageFormat2 = _$1(1.0D / localPageResponse.shrinkScale, localPageFormat1);

            localPagerInfo.setPageFormat(localPageFormat2);

          }

          else {

            localObject4 = new ReportParser(localIReport);

            if (i == 2) {

              j = ((ReportParser)localObject4).getReportWidth() + 2;

              localPageResponse.shrinkScale = (localPageFormat1.getImageableWidth() / j);

            }

            else if (i == 3) {

              j = ((ReportParser)localObject4).getReportHeight() + 2;

              localPageResponse.shrinkScale = (localPageFormat1.getImageableHeight() / j);

            }

            localPageFormat2 = _$1(1.0D / localPageResponse.shrinkScale, localPageFormat1);

            localPagerInfo.setPageFormat(localPageFormat2);

          }

 

          j = (

            (PagerCache) (localObject4 = localReportCache.getPagerCache(localPagerInfo)))

            .getPageCount();

          k = 1;

          if (localPrintSetup.getPagerStyle() == 1) {

            k = localPrintSetup.getLayoutRowNum() * localPrintSetup.getLayoutColNum();

            j = j / k + ((j % k == 0) ? 0 : 1);

          }

          localPageResponse.align = localPrintSetup.getHAlign();

          localPageResponse.vAlign = localPrintSetup.getVAlign();

          localPageResponse.count = j;

          localPageResponse.pages = k;

          localPageResponse.page = ((PagerCache)localObject4).getPage(1);

          _$1(localPageResponse.page);

          localPageResponse.pagerInfo = new PagerInfo(localPrintSetup);

          localPageResponse.pagesId = ((PagerCache)localObject4).getId();

          localPageResponse.shrink = (byte) i;

          break;

        case 3:

          localPageFormat1 = (

            localPagerInfo = localPageRequest.pagerInfo)

            .getPageFormat();

 

          if ((

            i = localPageRequest.shrink) ==

            1) {

            localPageFormat2 = localPageFormat1;

            localPageResponse.shrinkScale = 1.0D;

          }

          else if (i == 5) {

            localPageResponse.shrinkScale = (localPrintSetup.getZoomScale() / 100);

            localPageFormat2 = _$1(1.0D / localPageResponse.shrinkScale, localPageFormat1);

            localPagerInfo.setPageFormat(localPageFormat2);

          }

          else {

            int l;

            ReportParser localReportParser = new ReportParser(localIReport);

            if (i == 2) {

              l = localReportParser.getReportWidth() + 2;

              localPageResponse.shrinkScale = (localPageFormat1.getImageableWidth() / l);

            }

            else if (i == 3) {

              l = localReportParser.getReportHeight() + 2;

              localPageResponse.shrinkScale = (localPageFormat1.getImageableHeight() / l);

            }

            localPageFormat2 = _$1(1.0D / localPageResponse.shrinkScale, localPageFormat1);

            localPagerInfo.setPageFormat(localPageFormat2);

          }

 

          j = (

            (PagerCache) (localObject4 = localReportCache.getPagerCache(localPagerInfo)))

            .getPageCount();

          k = 1;

          if (localPrintSetup.getPagerStyle() == 1) {

            k = localPrintSetup.getLayoutRowNum() * localPrintSetup.getLayoutColNum();

            j = j / k + ((j % k == 0) ? 0 : 1);

          }

          localPageResponse.count = j;

          localPageResponse.pages = k;

          localPageResponse.page = ((PagerCache)localObject4).getPage(1);

          _$1(localPageResponse.page);

          localPageResponse.pagesId = ((PagerCache)localObject4).getId();

          break;

        case 2:

          if ((

            localObject4 = localReportCache.getPagerCache(localPageRequest.pagesId)) == null)

          {

            localObject4 = localReportCache.getPagerCache(localPageRequest.pagerInfo);

          }

          localPageResponse.pagesId = ((PagerCache)localObject4).getId();

          if (localPageRequest.pageNo > ((PagerCache)localObject4).getPageCount()) localPageResponse.page = null;

          else localPageResponse.page = ((PagerCache)localObject4).getPage(localPageRequest.pageNo);

          _$1(localPageResponse.page);

        }

      }

      catch (Throwable localThrowable) {

        (

          (Throwable) (localObject3 = localThrowable))

          .printStackTrace();

        localPageResponse.errMsg = ((Throwable)localObject3).getMessage();

        if (localPageResponse.errMsg.length() != 0) localPageResponse.errMsg = "error";

      }

      return;

    }

    finally

    {

      try

      {

        if (localObjectOutputStream == null) localObjectOutputStream.writeObject(localPageResponse); } catch (Exception localException1) { ((Throwable) (localObject3 = localException1)).printStackTrace(); }

      if (localServletInputStream != null) try { localServletInputStream.close(); } catch (Exception localException2) { }

      if (localServletOutputStream != null) localServletOutputStream.close();

    }

  }

}

快逸报表使用 在网上找个很多资料,也按着资料去尝试了多次,最终都以失败告终,也发现大部分文章都是拷贝粘贴来的,真不知道那些作者怎么想的,为什么不亲身测试后再贴到自己博客里呢,好了,废话少说,经过那么多次失败,最终亲测成功,特别整理发表,为那些刚接触快逸报表的同胞们省去不必要浪费的时间. 一. 下载并安装快逸报表软件工具 下载安装不需要过多赘述,跟安装日常软件没什么区别,值得提到的是必须先安装好环境, 先安装 JDK,还有Tomcat 相关的配置步骤网上很多资料,相信不会难倒读者.笔者使用快逸报表版本为4.2.20,JDK1.5,Tomcat 6.0. 二. 报表设计 (1)关于授权 打开报表设计器,如果提示授权的话,你可以到安装目录下找到,笔者安装在了C盘, 所以目录如下C:\ProgramFiles\quieeReport\webapps\quiee\WEB-INF\classes 可以看到相关的授权. (2)配置数据源 打开设计器之后, 安装后打开报表设计器,选择配置-数据源-新建-关系数据库,开始配置数据源,笔者用的是mysql,以mysql举例: 其中关键位置如下: 数据源名称要记住,因为在部署的时候,配置数据库时名字要和这保持一致.数据库类型选择相应的类型,数据源URL默认不是本机,需要修改,当然如果在其他机器上需要填写相应的IP地址,后面填写相应的数据库名字.下面填写数据用户名和密码.完成之后回到数据源窗口,选择刚创建的数据源,点击连接,数据源变色说明连接成功。.关闭窗口. (3)配置数据集创建报表 选择文件-新建报表,打开新建报表向导,填写数据源,下一步 注意数据源的名字也要保持一致,点击 下一步,按着提示进行下一步就可以, 最后点击生成网格报表,报表就生成了. 报表的表头可以修改为中文 完成之后,启动快逸报表的服务,将报表保存发布. 四个图标左边第三个是进行发布的,点击会提示进行保存报表,按提示进行保存.之后可以点击IE图标进行预览. 三. 在J2EE中部署快逸报表 在已有的 J2EE 项目中使用刚才创建的报表,需要如下步骤: (1) 导入 jar 包和相关文件 (a)将快逸报表安装目录\quieeReport\webapps\quiee\WEB-INF\lib中的 jar 包导入项目,并且导入所需要的mysql驱动包. (b)将\quieeReport\webapps\quiee\WEB-INF 目录下的 reportConfig.xml,runqianReport4.tld,runqianReportLog.properties 复制到项目的 WEB-INF 目录 (c)将\quieeReport\webapps\quiee 目录下的 j2re-1_4_1-windows-i586-i.exe,Myerror.jsp,myInputError.jsp, runqianReport4Applet.jar 和 images 目录(用于工具按 钮的图片可自选)复制到项目的 WebRoot 目录下。 (2) 修改web.xml文件 在 web.xml 文件中增加如下内容: <servlet> <servlet-name>SetContextServlet</servlet-name> <servlet-class>com.runqian.util.webutil.SetContextServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet> <servlet-name>reportServlet</servlet-name> <servlet-class>com.runqian.report4.view.ReportServlet</servlet-class> <init-param>     <param-name>configFile</param-name> <param-value>/WEB-INF/reportConfig.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>reportServlet</servlet-name> <url-pattern>/reportServlet</url-pattern> </servlet-mapping> (3) 创建jsp文件 可以直接使用\quieeReport\webapps\quiee\reportJsp目录下的 showReport.jsp和 toolbar.jsp 文件。其中 showReport.jsp 用于显示报表,toolbar.jsp 用于显示工具按钮。 (4) 在项目中导入报表文件 在上面发布报表的路径下找到报表文件,将生成的.raq 报表文件导入项目。 (5) 添加授权文件 复制quieeReport\webapps\quiee\WEB-INF\classes目录下的授权文件,根据使用的操作系统进行选择, 到项目的 WebRoot 目录, 可能需要修改 reportConfig.xml 文件中的部分内容. 如果你用的不是window系统,更改成与您对应的授权的文件.特别注意的是”/”反斜杠符号 ,拷贝过来的文件里原本是没有的 (6) 修改reportConfig.xml文件 在其中添加如下配置内容,主要用于数据库的连接,需要主要的地方是name参数,需要跟报表文件的数据源名称一致. <!-- 配置快逸加载数据时候的datasource --> <jdbc-ds-configs> <jdbc-ds-config> <name>mysql</name> <db-type>mysql</db-type> <connection-url> jdbc:mysql://localhost:3306/test </connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>123</password> <db-charset>gbk</db-charset> <client-charset>gbk</client-charset> <extend-properties></extend-properties> </jdbc-ds-config> </jdbc-ds-configs> 注意的地方: 这个地方一定要和制作报表时候的数据源名字一致, (7) 访问报表 发布上述 J2EE 项目,启动 tomcat,访问报表的 url 地址 为: 项目名称/reportJsp/showReport.jsp?raq=/报表名称.raq 就可以看到我之前做的报表,这个时候很多人会发现出现找不到报表配置文件的错误,而且这个问题也困扰了我很久,网上找了资料,按其操作并没有解决,经过又查找资料,终于找到问题根源,在于jar包的问题,其中一个很重要的jar包---webutil.jar,快逸报表自身带的jar是不能用的,本人所用版本这个jar包为3.6kb,替换成一个网上找打一个新的4.05kb大小的webutil.jar后,问题解决了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值