`

交叉报表

阅读更多

package test;

import java.io.*;
import java.util.*;
import javax.xml.parsers.*;

import java.awt.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;
import org.w3c.dom.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.lowagie.text.Font;
import com.lowagie.text.pdf.*;
import com.lucaslee.report.*;
import com.lucaslee.report.grouparithmetic.*;
import com.lucaslee.report.model.*;
import com.lucaslee.report.model.Table;
import com.lucaslee.report.model.crosstable.*;
import com.lucaslee.report.printer.*;

/**
* 生成交叉表报表例子。
* 从main方法开始执行。
* 注意:例子中对程序段的注释,方法是:在程序段前面加注释,在程序段后面注明段的结束.如:
* 前面://****xxxx***********
* 后面://****end xxxx*******
   *
   * <p>Copyright: Copyright (c) 2004</p>
   * <p>Company:Lucas-lee Soft </p>
   * @author Lucas Lee
   * @version 1.0
   */
public class TestCrossReport {
    public TestCrossReport() {
    }

    /**
     * 根据报表对象生成csv格式的报表.
     * @param report 报表对象
     * @throws Exception
     */
    public static void getExcelReport(Report report,OutputStream os) throws Exception {

      ExcelCss css = new ExcelCss() {
        public void init(HSSFWorkbook workbook) {

          //*****************定义字体*****************
           //普通字体
           HSSFFont fontNormal = workbook.createFont();
          fontNormal.setFontHeightInPoints( (short) 10);
          fontNormal.setFontName("宋体");

          //粗体
          HSSFFont fontBold = workbook.createFont();
          fontBold.setFontHeightInPoints( (short) 10);
          fontBold.setFontName("宋体");
          fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

          //大、粗字体
          HSSFFont fontBig = workbook.createFont();
          fontBig.setFontHeightInPoints( (short) 15);
          fontBig.setFontName("宋体");
          fontBig.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
          //*****************end定义字体*****************

           //***************设置EXCEL报表的样式表******************
          HSSFCellStyle style = workbook.createCellStyle();
          style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
          style.setFont(fontNormal);
          this.setGroupTotal(style);

          style = workbook.createCellStyle();
          style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
          style.setFont(fontNormal);
          this.setGroupTotal(style);

          this.setTotal(style);

          style = workbook.createCellStyle();
          style.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
          style.setFont(fontBold);
          this.setHead(style);

          style = workbook.createCellStyle();
          style.setFont(fontBig);
          this.setTitle(style);

          style = workbook.createCellStyle();
          style.setFont(fontNormal);
          this.setData(style);

          style = workbook.createCellStyle();
          style.setFillForegroundColor(HSSFColor.ORANGE.index);
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
          style.setFont(fontNormal);
          this.setCrossHeadHead(style);

          this.setDefaultColumnWidth( (short) 10);
          //***************end 设置EXCEL报表的样式表******************
        }
      };

      //执行EXCEL格式报表的输出
      new ExcelPrinter().print(report, css, os);

      System.out.println("生成Excel格式报表成功。");
    }

    /**
     * 根据报表对象生成HTML格式的报表.
     * @param report 报表对象
     * @throws Exception
     */
    public static void getHTMLReport(Report report,OutputStream os) throws Exception {


      //***************设置HTML报表的样式表******************
      HTMLCss css = new HTMLCss();
      css.setGroupTotal("BACKGROUND-COLOR: #d8e4f1; font: bold 12pt 隶书;");
      css.setHead("BACKGROUND-COLOR: #ffdead; font: bold 12pt 隶书;");
      css.setTotal("BACKGROUND-COLOR: #d8e4f1; font: bold 12pt 隶书;");
      css.setTitle("font: bold 18pt ;");
      css.setData("font: 12pt");
      css.setCrossHeadHead("BACKGROUND-COLOR: #a68763; font: 9pt ");
      //***************end 设置HTML报表的样式表******************

       //执行HTML格式报表的输出
      new HTMLPrinter().print(report, css, os);

      System.out.println("生成HTML格式报表成功。");
    }

    /**
     * 根据报表对象生成pdf格式的报表.
     * @param report 报表对象
     * @throws Exception
     */
    public static void getPDFReport(Report report,OutputStream os) throws Exception {
      //******************定义pdf中文字体*****************
      BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                                               BaseFont.NOT_EMBEDDED);
      BaseFont bfChineseBold = BaseFont.createFont("STSong-Light,Bold",
          "UniGB-UCS2-H",
          BaseFont.NOT_EMBEDDED);
      Font FontChinese = new Font(bfChinese, 10, Font.NORMAL);
      Font FontChineseBold = new Font(bfChineseBold, 10, Font.NORMAL);
      //******************end 定义pdf中文字体*****************

       //****************设置pdf报表的样式表*********************
      PDFCss css = new PDFCss();

      PDFCssItem item = new PDFCssItem();
      item.setBackgroudColor(new Color(0xd8e4f1));
      item.setFont(FontChinese);
      css.setGroupTotal(item);
      css.setTotal(item);

      item = new PDFCssItem();
      item.setBackgroudColor(new Color(0xffdead));
      item.setFont(FontChineseBold);
      css.setHead(item);

      item = new PDFCssItem();
      item.setFont(new Font(bfChineseBold, 15, Font.BOLD));
      css.setTitle(item);

      item = new PDFCssItem();
      item.setFont(new Font(bfChinese, 10, Font.NORMAL));
      css.setData(item);

      item = new PDFCssItem();
      item.setFont(new Font(bfChinese, 7, Font.NORMAL));
      item.setBackgroudColor(new Color(0xffdead));
      css.setCrossHeadHead(item);
      //****************end 设置pdf报表的样式表*********************

       //执行PDF格式报表的输出
      new PDFPrinter().print(report, css, os);

      System.out.println("生成PDF格式报表成功。");
    }

    /**
     * 根据报表对象生成csv格式的报表.
     * @param report 报表对象
     * @throws Exception
     */
    public static void getCSVReport(Report report,OutputStream os) throws Exception {
      //执行CSV格式报表的输出
      new CSVPrinter().print(report, os);

      System.out.println("生成CSV格式报表成功。");
    }

    /**
     * 设置报表的头部和尾部.
     * @param report 要设置头尾的报表对象.
     * @throws ReportException
     */
    private static void setTitleFooter(Report report) throws ReportException {
      //*****************设置报表头部*********************
       Table headerTable = new Table();
       //设置表格的宽度比例(百分比)
      int[] widths = {
          20, 60, 20};
      headerTable.setWidths(widths);
      report.setHeaderTable(headerTable);

      headerTable.setBorder(0);
      headerTable.setAlign(headerTable.ALIGN_CENTER);

      TableCell tc = null;
      TableRow tr = null;

      tr = new TableRow(3);
      headerTable.addRow(tr);
      tc = tr.getCell(0);
      tc.setColSpan(3);
      tc.setAlign(tc.ALIGN_CENTER);
      tc.setContent("中国XXX股份有限公司XXX分公司");
      tr.getCell(1).setIsHidden(true);
      tr.getCell(2).setIsHidden(true);

      tr = new TableRow(3);
      headerTable.addRow(tr);
      tc = tr.getCell(0);
      tc.setColSpan(3);
      tc.setAlign(tc.ALIGN_CENTER);
      tc.setContent("产品销售统计报表");
      tc.setCssClass(Report.TITLE_TYPE);
      tr.getCell(1).setIsHidden(true);
      tr.getCell(2).setIsHidden(true);

      tr = new TableRow(3);
      headerTable.addRow(tr);

      tr = new TableRow(3);
      headerTable.addRow(tr);
      tc = tr.getCell(0);
      tc.setContent("单位:xxx分公司");
      tc.setAlign(tc.ALIGN_LEFT);
      tc = tr.getCell(1);
      tc.setContent("报表日期:2003-11-11至2003-11-16");
      tc.setAlign(tc.ALIGN_CENTER);
      tc = tr.getCell(2);
      tc.setAlign(tc.ALIGN_RIGHT);
      tc.setContent("单位:吨 元");
      //*****************end 设置报表头部*********************

       //*****************设置报表尾部*********************
      Table footerTable = new Table();
      report.setFooterTable(footerTable);

      tr = new TableRow(3);
      footerTable.setBorder(0);
      footerTable.setAlign(footerTable.ALIGN_CENTER);
      footerTable.addRow(tr);
      tr.getCell(0).setContent("制表人:xxx");
      tr.getCell(0).setAlign(tc.ALIGN_LEFT);
      tr.getCell(1).setContent("审核人:xxx");
      tr.getCell(1).setAlign(tc.ALIGN_CENTER);
      tr.getCell(2).setContent("制表日期:xxx");
      tr.getCell(2).setAlign(tc.ALIGN_RIGHT);
      //*****************end 设置报表尾部*********************
    }

    /**
     * 从xml文件获得原始数据表格.注意其中使用的crossTabSample.xml应该设置为此文件所在的路径.
     * @return
     * @throws Exception
     */
   private static Table getTableByXML() throws Exception {
      //xml文件路径,应该设置为crossTabSample.xml所在的路径
      String fileName = "E:\\crossTabSample.xml";
      Table t = new Table();

      //用JAXP读取xml文件
      Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().
          parse(new File(fileName));
      Element e = doc.getDocumentElement();
      NodeList xmlTab = e.getChildNodes();
      for (int i = 0; i < xmlTab.getLength(); i++) {
        if (xmlTab.item(i).getNodeName().equals("Row")) {
          TableRow tr = new TableRow();
          NodeList xmlTR = xmlTab.item(i).getChildNodes();
          for (int j = 0; j < xmlTR.getLength(); j++) {
            if (xmlTR.item(j).getNodeName().equals("data")) {
              TableCell tc = new TableCell();
              tc.setContent(xmlTR.item(j).getFirstChild().getNodeValue());
              tr.addCell(tc);
            }
          }
          t.addRow(tr);
        }
      }
      return t;
    }

    /**
     * 获得报表对象
     * @throws Exception
     * @return Report
     */
    public static Report getReport() throws Exception {
      //报表管理器
      ReportManager rm = new ReportManager();

      //待处理的原始数据表格对象
      Table t = getTableByXML();

      //************定义交叉表*************
      HeadCol[] colH = {
          new HeadCol(2, "厂家")};
      HeadCol[] rowH = {
          new HeadCol(0, "品种"), new HeadCol(1, "市场")};
      Vector sort1 = new Vector();
      sort1.add("本单位");
      sort1.add("长江牌");
      colH[0].setSortSeq(sort1);

      CrossCol crs = new CrossCol(3, "销售额", new SumArithmetic());
      CrossTable crossTab = new CrossTable(colH, rowH, crs);
      //************end 定义交叉表*************

       //通过原始数据和交叉表的定义生成交叉表
      t = rm.generateCrossTab(t, crossTab);

      //进行行统计
      t = rm.generateCrossTabRowTotal(t, crossTab, true,
                                      new SumArithmetic());

      //进行列统计
      t = rm.generateCrossTabColTotal(t, crossTab, false, new SumArithmetic());

      //格式化数据
      t = rm.formatData(t, crossTab, new DefaultFormatter());

      //****************定义报表的其他部分****************
      Report report = new Report();

      //将交叉表设为报表的主体
      ReportBody body = new ReportBody();
      body.setData(t);
      report.setBody(body);

      //设置报表的头和尾两部分
      setTitleFooter(report);
      //****************end 定义报表的其他部分************
      return report;
    }

    /**
     * 生成报表.
     * @throws Exception
     */
    public static void generateReport() throws Exception {
      Report report = getReport();
      //输出文件
      FileOutputStream fo=null;

      try {
        //生成HTML格式报表

/*       fo = new FileOutputStream("crossTab.html");
        getHTMLReport(report, fo);
        fo.close();

        //生成PDF格式报表
        fo = new FileOutputStream("crossTab.pdf");
        getPDFReport(report, fo);
        fo.close();

        //生成CSV格式报表
        fo = new FileOutputStream("crossTab.csv");
        getCSVReport(report, fo);
        fo.close();*/

        //生成Excel格式报表
        fo = new FileOutputStream("E:\\crossTab.xls");
        getExcelReport(report, fo);
        fo.flush();
        fo.close();
      } finally{
        if(fo!=null) fo.close();
      }

    }

    public static void main(String[] args) throws Exception {
      generateReport();
    }

}

分享到:
评论

相关推荐

    JasperReport 中交叉报表指南

    在报表生成中,交叉报表是一种常用的报表类型,能够将数据按照行和列进行交叉处理,生成一个交叉表。以下是 JasperReport 中交叉报表的生成指南: 1. 设置 subDataSets 数据源 在 JasperReport 中,交叉报表需要...

    水晶报表交叉报表设计

    在这个“水晶报表交叉报表设计”主题中,我们将深入探讨如何利用水晶报表来创建、定制和优化交叉报表。 首先,我们需要理解交叉报表的基本结构。交叉报表由行区域(Row Area)和列区域(Column Area)组成,行区域...

    ReportMachine 交叉报表 学生成绩表

    【ReportMachine 交叉报表 学生成绩表】是一款专业用于数据可视化和分析的工具,尤其在教育领域中,它能够高效地展示和解读学生的学习成绩。交叉报表是一种强大的数据分析技术,通过行列交叉的方式,可以清晰地揭示...

    Ireport 用子报表调用交叉报表

    交叉报表,又称为透视表,用于以行列方式展示数据,通常包含汇总和总计功能,可以按行、列进行分组和计算。 1. **创建交叉报表**: - 在 IReport 中,新建一个报表并选择“交叉表”组件。 - 设定查询语句,确保它...

    ireport交叉报表自定义排序

    ### iReport交叉报表自定义排序 #### 背景与问题描述 在处理复杂的报表设计时,特别是使用iReport工具创建交叉报表(Crosstab)的过程中,常常会遇到需要对数据进行特定排序的需求。默认情况下,交叉报表中的数据...

    用PB交叉报表写的用户管理、权限分配

    交叉报表,也称为透视表,允许数据以行列互换的方式显示,便于分析和比较。在用户管理和权限分配的场景下,可能通过交叉报表来直观地展示用户的角色分配,或者角色拥有的各种权限。例如,列可以代表用户,行可以代表...

    水晶报表交叉表

    ### 水晶报表交叉表知识点详解 #### 一、交叉表的概念与作用 **交叉表**是一种特殊类型的报表布局,主要用于展示多个维度上的数据对比分析。它通过将数据按照行和列的不同维度进行组织,形成一个二维表格,使得用户...

    用iReport制作交叉表(CrossTabs).doc

    其中,交叉表(CrossTabs)是 iReport 中的一个重要组件,允许用户创建复杂的交叉报表。下面是关于 iReport 制作交叉表的详细知识点: 什么是交叉表(CrossTabs) 交叉表是一种特殊的表格,在设计时既不确定行数和...

    用birt设计交叉报表的详细例子

    交叉报表,又称交叉表或透视表,是一种数据分析工具,能够帮助用户通过行列互换、聚合数据来洞察数据模式。 标题“用BIRT设计交叉报表的详细例子”意味着我们将探讨如何使用BIRT工具来创建一个复杂的交叉报表,并...

    如何制作多层表头的交叉报表

    交叉报表,也被称为透视表或交叉表,是一种能够同时展示多个维度数据的报表形式。在交叉报表中,行和列的交汇点通常用于计算汇总值,例如总计、平均值或百分比。多层表头则进一步增强了这种表现力,它允许在行或列上...

    RDLC交叉报表示例

    RDLC交叉报表是其中一种特殊类型的报表,它能够在一个单一的视图中显示多维度的数据,例如按行和列交叉排列的数据,类似Excel中的数据透视表。 交叉报表的核心在于它的行列结构,允许用户根据多个字段进行分组和...

    关于ireport交叉报表

    iReport交叉报表详细知识点 iReport交叉报表是iReport JasperReports1.1.1版本中新增加的功能之一,它允许用户创建交叉报表,即使报表的行和列都是从数据库中读取的,而不是普通那种列固定行是从数据库中读取。下面...

    数据分层汇总交叉报表SQL语句实现方法

    数据分层汇总交叉报表是数据分析领域中常见的需求,主要用于管理层获取多维度的业务洞察。在管理系统中,这种报表通常需要处理复杂的数据结构,以便展示不同层次的汇总信息。本文将探讨如何利用SQL语句实现这样的...

    CrossTab_demo百灵报表(BIRT)交叉表(演示二).rar

    在这个“CrossTab_demo百灵报表(BIRT)交叉表(演示二)”的压缩包中,我们主要探讨的是如何使用BIRT来创建和操作交叉表,这是一种强大的数据汇总和分析工具。 交叉表,又称透视表,是数据处理和分析中的常用手段。它...

    ireport开发交叉报表资料及笔记

    4. 自定义样式:通过样式表,你可以调整交叉报表的颜色、字体、边框等视觉效果。 四、实际项目经验分享 1. 性能优化:在处理大量数据时,合理设置查询条件和缓存策略,以减少服务器负载。 2. HTML显示:ireport生成...

    asp.net 交叉报表案例

    交叉报表(Cross-Tab Report)是其中一种特殊类型的报表,它允许用户以行列交错的方式查看数据,从而更容易发现模式和趋势。在商业智能和数据分析领域,交叉报表尤其受欢迎,因为它们能够有效地处理多维数据。 "asp...

    birt API 动态创建交叉表

    BIRT(Business Intelligence and Reporting Tools)是Eclipse基金会下的一个开源报表系统,它提供了一整套工具,使得开发者能够利用API动态地创建和定制复杂的报表,包括交叉表(Cross Tab)。交叉表是一种数据汇总...

    UAP培训_890(交叉报表).rar

    交叉报表在数据分析领域具有重要意义,它能帮助用户从多角度、多层次分析数据,提供丰富的透视表功能,以更直观的方式展示复杂的数据关系。 【描述】:“UAP培训_890(交叉报表).rar”描述简单明了,表明这是一个...

    iReport柱状图和交叉表画法

    本文介绍如何在iReport中设计柱状图和交叉表两种常用的报表格式。 首先介绍柱状图的画法。在进行柱状图设计之前,需要在数据库中建立数据表并填充数据。以手机销售数据为例,假设我们有一个名为phone_sale的表,它...

    Cognos列表和交叉表锁定表头功能

    Cognos 列表和交叉表锁定表头功能是报表页面中的一种重要功能,能够提高报表的可读性和用户体验,提高报表的整体质量。 知识点: * Cognos BI 是一种商业智能软件,提供了报表、分析和数据挖掘等功能。 * HTML ...

Global site tag (gtag.js) - Google Analytics