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

2024-05-02 02:32
文章标签 java 开发 web 报表 report

本文主要是介绍基于JavaReport的Web报表开发【3】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面给出一个Servlet报表开发的详细模板,以供参考。
  Servlet报表开发模板
  import javax.servlet.http.*;
  import com.javareport.beans.*;
  public class Template extends WebReportEngine {
   * 这是报表系统在应用中给开发人员的JSP模板文件,可以根据需要调整接口内容。部分函
   * 数可以适当删除。在开发中一般是实现createReport()函数就可以,形成实时动态报表
   * 就是在这个函数里实现的。剩下的工作(怎样在Web上显示,怎样形成Work,PDF文件等)
   * 交给报表引擎自动实现。
  /**
   *   建立报表,返回报表的实例。这个报表实例可以在Web上显示,同时也可以导出Word,Excel,
   * 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所示。

这篇关于基于JavaReport的Web报表开发【3】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953217

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory