基于JavaReport的Web报表开发实例

来源:互联网 发布:淘宝立即购买按钮代码 编辑:程序博客网 时间:2024/05/19 17:04

【实例1】  用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图形;实际工程中一维数据的数据来源常常来自于对数据库中数据查询的结果。

 

【实例2】  用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所示。

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

 

【实例3】  用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所示。

【实例4】  用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所示。

 

基于JavaReport的Web报表开发(文档下载)