基于JavaReport的Web报表开发【3】

下面给出一个Servlet报表开发的详细模板,以供参考。
  Servlet报表开发模板
  import javax.servlet.http.*;
  import com.javareport.beans.*;
  public class Template extends WebReportEngine {
   * 这是报表系统在应用中给开发人员的JSP模板文件,可以根据需要调整接口内容。部分函
   * 数可以适当删除。在开发中一般是实现createReport()函数就可以,形成实时动态报表
   * 就是在这个函数里实现的。剩下的工作(怎样在Web上显示,怎样形成Work,PDF文件等)
   * 交给报表引擎自动实现。
  /**
   *   建立报表,返回报表的实例。这个报表实例可以在Web上显示,同时也可以导出WordExcel
   * PDF,CSV,HTML等格式的文档供使用。
   */
  public Report createReport(HttpServletRequest request) throws Exception{
    Report report = new Report();
    report.addText("This is a template !");
    return report;
  }

 

  /**
   * 这是对上一个页面Form提交的参数进行检查,由于实时报表需要动态的参数,在这里进
   * 行数据校验。
   * 返回值为null时代表通过,其他内容则为参数错误的提示信息。
   */
  public String validate(HttpServletRequest request){
    return null;
  }


  /**
   *   这是报表在Web上显示时,内容显示出来前执行的脚本,脚本内容一般为JavaScript脚
   * 本或VBScript脚本。
   * 返回值为null时代表通过没有脚本内容。
   */
  public String getStartScript(HttpServletRequest request){
    return null;
  }

  /**
  *   这是报表在Web上显示时,内容显示出来后执行的脚本,脚本内容一般为JavaScript脚
   * 本或VBScript脚本。
   * 返回值为null时代表通过没有脚本内容。
   */
  public String getEndScript(HttpServletRequest request){
  return null;
  }

  /**
   * 这是报表在Web上显示时,上面的工具栏为标准的样式(上下翻页,导出文件)。可以在
   * 此扩展工具栏的内容,一般可以添加公司主页的链接,返回上一层链接的“返回”按钮就是
   * 在这里添加脚本的。
   * 返回值为null时代表不添加内容。
   */
  public String getToolbarScript(HttpServletRequest request){
    return null;
  }

  /**
   *   这是报表在Web上显示时,如果不想让工具栏显示出来,就让函数的返回值就false就可以。
   * 注意:如果是多页报表,上下翻页按钮就无法使用。
   */
  public boolean isShowToolbar(){
    return true;
  }


  /**
   * 这是报表在Web上显示时,导出文件的按钮可以自定义,比如应用中只要导出PDF文件,
   * 其他的不需要,就可以这里设定。按钮值从Work按钮开始是(1,2,4,8,...  ),需要
   * 显示的按钮则将它们的值相加就可以了。
   */
  public int getAllEchoButton(){
    return 0xFFFF;
  }
  %>

 17.3.5  Web报表开发实例
  【实例131】  用JavaReport输出一维数据图形
  本实例将实现用JavaReport来在JSP页面中显示一维数据的图形,使用页面首部的工具按钮栏可进行翻页来显示所输出常见的8种图形。源代码如下:
  ChartYW.jsp
  <%@ page contentType="text/html; charset=GBK" %>
  <%@ page import="com.javareport.beans.*"%>
  <%@ page extends="com.javareport.http.WebReportEngine"%>
  <%!
  public Report createReport(HttpServletRequest request) throws Exception{
    //图片类型数组
    int[] chartType = new int[]{
  Chart.CHART_PIE3D,Chart.CHART_STACKBAR3D,
  Chart.CHART_CURVE,Chart.CHART_LINE,
  Chart.CHART_POINT,Chart.CHART_INVERTED_CURVE,
  Chart.CHART_INVERTED_LINE,Chart.CHART_INVERTED_STACKBAR};
  //单元数据的显示标签字符串数组
    String[] labels = new String[] {"华南地区","华东地区","华北地区","东北地区"};
  //实例化报表对象
    Report report = new Report();
    //在页眉中添加文本信息内容
    report.addHeaderText("统计图表例子");
    //在报表的页眉添加一条横直线
    report.addHeaderSeparator(1);
    //在页尾添加一条横直线
    report.addFooterSeparator(1);
    //在页尾添加文本信息内容
    report.addFooterText("第{P}页, 共{N}页");
  //循环输出各种类型的图片
    for (int i = 0; i < chartType.length; i++) {
        try {
            //实例化一个图表对象
            Chart chart = new Chart((Number[][])getData(request));
            //设置图表中的单元数据的显示的标签
            chart.setLabels(labels);
            //设置统计图的类型
            chart.setStyle(chartType[i]);
            //设置统计图中显示的时候把具体的数值也显示出来
            chart.setShowValue(true);
            //在报表中添加文本信息内容
            report.addText("报表中常见的报表统计图表("+i+"): ");
            //在报表中添加图表信息内容
            report.addChart(chart);
            //在报表中添加换行符号
            report.addBreak();
            report.addBreak();
            report.addBreak();
        }
        catch (Exception ex) {
            ex.printStackTrace();
          }
      }
      return report;
  }

  // 用户根据自己的实际情况,从数据库提取动态的数值
  public Double[][] getData(HttpServletRequest request){
    Double[][] data = new Double[1][4];
    data[0][0] = new Double(200);
    data[0][1] = new Double(500);
    data[0][2] = new Double(350);
    data[0][3] = new Double(550);
    return data;
  }
  //定制Web报表在页面首部显示的工具栏为标准的样式,增加一个"返回"按钮,返回到首页
  public String getToolbarScript(HttpServletRequest request){
    return "<a href=/"../index.htm/"><img   src=/""+request.getRequestURI()+
  "?op=Resource&name=/resource/back.gif/" border=/"0/"   alt=/"返回/"></a>";
  }
  %>
  程序运行的结果如图17-13所示。
 


  可见,JavaReport只使用了少量的代码就输出了美观而又实用的Web图形;实际工程中一维数据的数据来源常常来自于对数据库中数据查询的结果。

 【实例132】  用JavaReport输出二维数据图形
  二维数据图形与一维数据图形的区别就是在数据展现上加大了数据的展现量,在同一个单元数据标签处可显示属于同一个单元数据的多个数据。看了下面的源代码和运行的结果,就会理解它们之间到底有什么区别了。源代码如下:
  ChartEW.jsp
  <%@ page contentType="text/html; charset=GBK" %>
  <%@ page import="com.javareport.beans.*"%>
  <%@ page extends="com.javareport.http.WebReportEngine"%>
  <%!
  public Report createReport(HttpServletRequest request) throws Exception{
    //图片类型数组
    int[] chartType = new int[]{
  Chart.CHART_PIE3D,Chart.CHART_STACKBAR3D,
  Chart.CHART_CURVE,Chart.CHART_LINE,
  Chart.CHART_POINT,Chart.CHART_INVERTED_CURVE,
  Chart.CHART_INVERTED_LINE,Chart.CHART_INVERTED_STACKBAR};
  //单元数据的显示标签字符串数组
    String[] labels = new String[] {"华南地区","华东地区","华北地区","东北地区"};
  //实例化报表对象
    Report report = new Report();
    //在页眉中添加文本信息内容
    report.addHeaderText("统计图表例子");
    //在报表的页眉添加一条横直线
    report.addHeaderSeparator(1);
    //在页尾添加一条横直线
    report.addFooterSeparator(1);
    //在页尾添加文本信息内容
    report.addFooterText("第{P}页, 共{N}页");
  //循环输出各种类型的图片
    for (int i = 0; i < chartType.length; i++) {
        try {
            //实例化一个图表对象
            Chart chart = new Chart((Number[][])getData(request));
            //设置图表中的单元数据的显示的标签
            chart.setLabels(labels);
            //设置统计图的类型
            chart.setStyle(chartType[i]);
            //设置统计图中显示的时候把具体的数值也显示出来
            chart.setShowValue(true);
            //在报表中添加文本信息内容
            report.addText("报表中常见的报表统计图表("+i+"): ");
            //在报表中添加图表信息内容
            report.addChart(chart);
            //在报表中添加换行符号
            report.addBreak();
            report.addBreak();
            report.addBreak();
        }catch (Exception ex) {
            ex.printStackTrace();
          }
      }
      return report;
  }
  // 用户根据自己的实际情况,从数据库提取动态的数值
  public Double[][] getData(HttpServletRequest request){
    Double[][] data = new Double[4][4];
    data[0][0] = new Double(200); data[0][1] = new Double(250);
     data[0][2] = new Double(220); data[0][3] = new Double(280);
    data[1][0] = new Double(500); data[1][1] = new Double(700);
  data[1][2] = new Double(520); data[1][3] = new   Double(900);
    data[2][0] = new Double(350); data[2][1] = new Double(400);
  data[2][2] = new Double(380); data[2][3] = new   Double(320);
    data[3][0] = new Double(550); data[3][1] = new Double(590);
  data[3][2] = new Double(337); data[3][3] = new   Double(340);
    return data;
  }
  //定制Web报表在页面首部显示的工具栏为标准的样式,增加一个"返回"按钮,返回到首页
  public String getToolbarScript(HttpServletRequest request){
    return "<a href=/"../index.htm/"><img src=/""+request.getRequestURI()+
    "?op=Resource&name=/resource/back.gif/" border=/"0/" alt=/"返回/"></a>";
  }%>
  程序的运行结果如图17-14所示。


  从源代码上来看,与输出一维数据图形的代码大部分是相同的,区别之处就在于设置的图形实例化时的数据数组中的数据不同。

【实例133】  用JavaReport输出报表
  本例将输出两种常用的报表,一种是普通的二维报表;另一种是含有合并单元格的报表。源代码如下:
  Table.jsp
  <%@ page contentType="text/html; charset=GBK" %>
  <%@ page import="java.awt.*"%>
  <%@ page import="com.javareport.beans.*"%>
  <%@ page extends="com.javareport.http.WebReportEngine"%>
  <%!
  public Report createReport(HttpServletRequest request) throws Exception{
    //实例化报表对象
    Report report = new Report();
    //在页眉中添加文本信息内容
    report.addHeaderText("报表输出示例");
    //在报表的页眉添加一条横直线
    report.addHeaderSeparator(1);
    //在页尾添加一条横直线
    report.addFooterSeparator(1);
    //在页尾添加文本信息内容
    report.addFooterText("第{P}页, 共{N}页");
   
 //在报表中添加文本信息内容
    report.addText("销售情况一览表:");
    //在报表中添加换行符号
    report.addBreak();
    //在报表中添加表格
    report.addTable(getTableA());
    //在报表中添加换行符号
    report.addBreak();
 
  //在报表中添加文本信息内容
    report.addText("销售情况一览表(合并表格):");
    //在报表中添加换行符号
    report.addBreak();
    //在报表中添加表格
    report.addTable(getTableB());
    //在报表中添加换行符号
    report.addBreak(); 

    return report;
  }
  //------得到销售情况一览表对象------
  public Table getTableA(){
    String[][] data = getData();
    Table table = new Table(data);
    table.setColBorder(0);
    table.setRowBorder(0);
    table.setRowBorder(0,1);
    table.setRowBackground(0,new Color(128,0,0));
    table.setRowForeground(0,Color.white);
    table.setRowBackground(1,new Color(255,255,128));
    table.setRowForeground(1,Color.black);
    table.setRowBackground(2,new Color(255,255,128));
    table.setRowForeground(2,Color.black);
    table.setRowBackground(3,new Color(255,255,128));
    table.setRowForeground(3,Color.black);
    table.setRowBackground(4,new Color(255,255,128));
    table.setRowForeground(4,Color.black);
    table.setRowBackground(5,new Color(255,255,128));
    table.setRowForeground(5,Color.black);
    return table;
  }
  //------得到销售情况一览表(合并表格)对象------
  public Table getTableB(){
    String[][] data = getTotalData();
    Table table = new Table(data);
    table.setAlignment(Table.H_CENTER + Table.V_CENTER);
    table.setColAutoSize(true);
    table.setRowBackground(0,Color.LIGHT_GRAY);
    table.setRowBackground(1,Color.LIGHT_GRAY);
    table.setColBackground(0,Color.LIGHT_GRAY);
    table.setRowBackground(7,new Color(255,255,128));
    table.setHeaderRowCount(2);
    table.setHeaderColCount(1);
    table.setRowBorder(table.LINE_THIN);
    table.setColBorder(table.LINE_THIN);
    table.setCellSpan(0,0,new Dimension(1,2));
    table.setCellSpan(0,1,new Dimension(2,1));
    table.setCellSpan(0,3,new Dimension(2,1));
    table.setCellSpan(0,3,new Dimension(2,1));
    return table;
  }

  //生成销售情况数据,实际工程中一般从数据库中获取
  public String[][] getData(){
    String[][] data = new String[6][4];
    data[0][0] = "区域"; data[0][1] = "第一季度"; data[0][2] =   "第二季度"; data[0][3] = "第三季度";
    data[1][0] = "华南地区"; data[1][1] = "¥2,000,000";
  data[1][2] = "¥2,500,000"; data[1][3] = "¥2,200,000";
    data[2][0] = "华东地区"; data[2][1] = "¥6,000,000";
  data[2][2] = "¥4,500,000"; data[2][3] = "¥4,800,000";
    data[3][0] = "华中地区"; data[3][1] = "¥500,000";
  data[3][2] = "¥400,000"; data[3][3] = "¥700,000";
    data[4][0] = "华北地区"; data[4][1] = "¥3,000,000";
  data[4][2] = "¥3,200,000"; data[4][3] = "¥2,500,000";
    data[5][0] = "东北地区"; data[5][1] = "¥4,000,000";
  data[5][2] = "¥5,000,000"; data[5][3] = "¥4,400,000";
    return data;
  }
  //得到销售汇总统计数据,实际工程中一般从数据库中获取
  public String[][] getTotalData(){
    String[][] data = new String[8][5];
    data[0][0] = "区域"; data[0][1] = "上半年"; data[0][3] = "下半年";
    data[1][1] = "第一季度"; data[1][2] = "第二季度"; data[1][3] = "第三季度";data[1][4] = "第四季度";
    data[2][0] = "华南地区"; data[2][1] = "¥2,000,000"; data[2][2] = "¥2,500,000";
  data[2][3] = "¥2,200,000";data[2][4] = "¥0";
    data[3][0] = "华东地区"; data[3][1] = "¥6,000,000"; data[3][2] = "¥4,500,000";
  data[3][3] = "¥4,800,000";data[3][4] = "¥0";
    data[4][0] = "华中地区"; data[4][1] = "¥500,000"; data[4][2] = "¥400,000";
  data[4][3] = "¥700,000";data[4][4] = "¥0";
    data[5][0] = "华北地区"; data[5][1] = "¥3,000,000"; data[5][2] = "¥3,200,000";
  data[5][3] = "¥2,500,000";data[5][4] = "¥0";
    data[6][0] = "东北地区"; data[6][1] = "¥4,000,000"; data[6][2] = "¥5,000,000";
  data[6][3] = "¥4,400,000";data[6][4] = "¥0";
    data[7][0] = "总计"; data[7][1] = "¥15,500,000"; data[7][2] = "¥15,600,000";
    data[7][3] = "¥14,600,000";data[7][4] = "¥0";
      return data;
  }
  //定制Web报表在页面首部显示的工具栏为标准的样式,增加一个"返回"按钮,返回到首页
  public String getToolbarScript(HttpServletRequest request){
      return "<a href=/"../index.htm/"><img   src=/""+request.getRequestURI()+
    "?op=Resource&name=/resource/back.gif/" border=/"0/" alt=/"返回/"></a>";
  }
  %>
  程序的运行结果如图17-15所示。

【实例134】  用JavaReport的RsTable对象输出报表
  本例将沿用第7章中在SQL Server数据库testDataBase中创建的表userTable,实现输出用户资料报表,这个报表可导出成PDF、EXCEL等格式,并在页面首部的工具栏中加入的排序的超链接,可根据需要来对报表中的数据进行排序,其实质上改变SQL语句中的order by子句中的排序字段来实现的。源代码如下:
  RsTable.jsp
  <%@ page contentType="text/html; charset=GBK" %>
  <%@ page import="java.awt.*"%>
  <%@ page import="java.sql.*"%>
  <%@ page import="com.javareport.beans.*"%>
  <%@ page import="com.javareport.http.*"%>
  <%@ page extends="com.javareport.http.WebReportEngine"%>
  <%!
  // 建立报表,返回报表的实例。
  public Report createReport(HttpServletRequest request) throws Exception{
    Report report = new Report();         // 实例化报表对象
    RsTable rst = getRsTable(request);    // 创建表格对象

 

    //设置页眉和页角的显示内容.
    report.addHeaderText("记录集表格程序示例");
    report.addHeaderSeparator(1);
    report.addFooterSeparator(1);
    report.addFooterText("第{P}页, 共{N}页");

    //设置报表中间显示的内容.
    report.addText("系统用户资料表:");
    report.addBreak();
    report.addBreak();
    report.addTable(rst);             //把录集表格对象添加到报表容器中.
    report.addBreak();

    return report;
  }

  // 生成ResultSet表格,同时设置对象的相关属性.
  public RsTable getRsTable(HttpServletRequest request)  throws Exception {
    ResultSet rs = getResultSet(request); //查询得到记录集,这是实时动态数据的来源.
    RsTable rsTable = new RsTable(rs);    //实例化记录集表格对象

    // 设置表格显示列名时的映射关系,即显示成为中文的名称
    String[][] map = new String[][]{{"user_id","用户编号"},{"user_name","用户名"},
    {"user_true_name","用户真实姓名"},{"user_age","用户年龄"},{"user_sex","用户性别"},{"user_address","用户地址"}};
    rsTable.setMapping(map);

    // 置表格的样式,行和列的边线都显示出来,表头的列名显示成灰色,对齐方式为中间对齐,列宽度自动调整.
    rsTable.setRowBorder(RsTable.LINE_THIN);
    rsTable.setColBorder(RsTable.LINE_THIN);
    rsTable.setRowBackground(0,Color.LIGHT_GRAY);
    rsTable.setAlignment(Table.H_CENTER + Table.V_CENTER);
    rsTable.setColAutoSize(true);

    return rsTable;
  }

  // 查询得到一个ResultSet对象,这里访问的是一个SQL Server数据库
  public ResultSet getResultSet(HttpServletRequest request)  throws Exception {
      String orderByCol =   Tools.getParameter(request,"orderby","user_id");
    String strurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testDatabase";
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    Connection conn=DriverManager.getConnection(strurl,"sa","6599996") ;
    Statement stmt=conn.createStatement();
    ResultSet rs = stmt.executeQuery("select user_id,user_name,user_true_name, user_age,user_sex,user_address from"+
   " userTable order by "+orderByCol);
    return rs;
  }

  // 这是工具栏中的显示返回按钮的脚本代码
  public String getToolbarScript(HttpServletRequest request){
    String uri = request.getRequestURI();
    return "<a href=/"../index.htm/"><img   src=/""+request.getRequestURI()+
  "?op=Resource&name=/resource/back.gif/" border=/"0/" alt=/"返回/"></a>"+
  " <FONT size=/"1/"> 排序方式"+
  "[<a href=/""+uri+"?orderby=user_id/">编号</a>]"+
 "[<a href=/""+uri+"?orderby=user_name/">用户名</a>]"+
  "[<a href=/""+uri+"?orderby=user_sex/">性别</a>]"+
  "[<a href=/""+uri+"?orderby=user_age/">用户年龄</a>]"+
  "</FONT>";
  }
  %>
  程序的运行结果如图17-16所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值