<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 11  文章 - 79  trackbacks - 0
    <2016年5月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    歡迎合作

     

    聯系方式:openhandx@foxmail.com

     

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     

     

     

     

     

      OpenHandX-Report 1.01

    多維度報表工具

     

     

     

     

     

     

     

     

     

     

    2011-9-9

     

    作者:彭明華

    openhandx@foxmail.com

     

    本文檔中的任何部分都不得以任何手段任何形式進行復制與傳播

     

     

     

    目錄

    1            前言

    2                需求

    3                名次解釋

    4                主要特性

    5                多個報表支持

    6                多Sheet支持

    7                多重數據支持

    8                交叉表

    9                固定交叉表

    10              列表

    11              固定列表

    12              靜態數據

    13              圖表

     

     


     

    1    前言

    OpenHandx-Report是一個輕量級的多維度Excel報表工具,核心采用了Poi和OpenHandX-chart,同時支持Excel的2003和2007文件格式輸出。OpenHandx-Report之所以不叫報表平臺而只叫做報表工具,是因為OpenHandx-Report使用簡單、沒有花哨的功能,他本身沒有自己的模板設計工具和報表服務功能。OpenHandx-Report一切都遵循開發人員的習慣,使開發人員學習成本更低。他也具有一些商業報表平臺所沒有的功能,如:海量數據的支持、模板影射技術等。

    2          需求

    OpenHandx-Report 1.0需要:    

    Java 5

    open-common

    open-chart

    jfreechart-1.0.13(與open-chart相關包)

    poi-3.6

    xmlbeans2.3(與poi-3.6相關包)

    dom4j-1.6(與poi-3.6相關包)

    geronimo-stax-api_1.0(與poi-3.6相關包)

    commons-beanutils-1.7

    commons-logging-1.0.4

     

    3          名次解釋

    交叉表數據:分析型數據庫星型(雪花型)結構的數據

    列表(多維度)數據:關系型數據庫的列表數據

     

    4          主要特性

    Excel20032007兩種格式-在同一套配置同一套數據下只要分別提供Excel20032007兩個格式的模板就能提供兩種格式的報表輸出

    報表設計簡單并所見即所得- Excel就是OpenHandx-Report的報表設計工具,Excel本身的功能和方便性就超過任何一款報表設計工具,并且絕大多數開發人員都會使用

    復雜和大型報表異步輸出-提供報表異步輸出,并提供異步生成的監控接口可以時時監控報表的完成情況和生成錯誤

    海量數據的支持-集成了OpenHandx-common特有持久技術能一次從數據庫中取出所有數據(只要硬盤的剩余空間足夠大),并將這海量數據當作數據源生成報表

    5種表格功能-支持靜態單元格、普通列表、固定列表、交叉表、固定交叉表等5種格式,這些功能能滿足聯機報表和分析性報表的需求

    9種圖表功能-支持的圖表有區域圖、柱狀圖、儀表圖、折線圖、餅圖、雷達圖、環狀圖、點圖、瀑布圖

    強大的數據計算功能-OpenHandx-Report具有OpenHandx-Common所有的表達式計算功能,同時支持數據匯總、記錄數、平均值等功能

    同一Sheet表單同時支持多種展現方式-在同一個Sheet表上可以輸出多個表格數據和圖表,目前OpenHandx-Report支持5種表格、9種圖表

    同一數據源多Sheet表單支持-同一個數據源可以根據需求輸出到不同的Sheet表單,這樣有利于同時展現不同種類的業務數據,也能滿足最終客戶的不同需求

    多重數據展示功能-采用模板影射技術,能將多個數據源影射到一套模板并合成一個Excel文件輸出,這樣滿足最終客戶的特殊需求

    Excel20032007兩種格式-在同一套配置同一套數據下只要分別提供Excel20032007兩個格式的模板就能提供兩種格式的報表輸出。

     

     

     

     

    5    多個報表支持


    同一個
    Sheet支持多個報表,并支持混合多種類型報表、圖表。即同一Sheet表單同時支持多種展現方式。

     

    6    多Sheet支持


    在同一個
    Excel中支持多個Sheet報表渲染

     

    7    多重數據支持

    模板如下:


    目標報表:


     

    采用模板影射技術,能將多個數據源影射到一套模板并合成一個Excel文件輸出。

    如:模板中只有一個“銷售明細”sheet,目標報表可以根據當前數據渲染多個“xx月銷售明細”sheet

     

    8    交叉表

    交叉表是面向數據挖掘分析維表



    交叉表例子展示了:

    1、 多個維度的交叉(行維度:地區、省份、城市,列維度:種類、水果、月份)

    2、 多個度量值的展示(數量、金額)

    3、 多個維度、多個度量匯總統計、單元格合并(按地區、省份、種類、水果小計)

    4、 最后是總計、平均值

    除了以上的展示外還有以下功能:

    1.   小計、總計分別提供求平均值、記錄數,并允許自定義表達式方式對不同維度進行單元格間的計算

    2.   小計、總計顯示風格上可以定義在維度字段、表格的最后,也允許定義在維度字段、表格的最前

    3.   多個度量值的顯示默認是縱向排列,也可以橫向排列

    4.   度量值的顯示可以按照預先定義的模板格式化輸出

    5.   允許自定所有維度不排序、排序、倒序

    6.   每個度量值、維度、小計、總計可以設置顯示字體、字體大小、顏色、是否粗體、是否斜體

     

     

    9    固定交叉表

    固定交叉表也是面向數據挖掘分析維表,但是客戶只要需展示部分的數據,數據的選取規則由模板來確定

    比如:


    該模板是按照客戶需求只想展示白菜、青椒、土豆等水果蔬菜,下面的表單展示部分月的數據


    例子中可以看出固定交叉表繼承了交叉表的所有特性:

    1.   同樣支持多個維度、多個度量值的展示

    2.   同樣支持多個維度、多個度量匯總統計、單元格合并(按地區、省份、種類、水果小計)

    3.   按照模板定義篩選數據

     

    10 列表

    列表是面向聯機開發的普通數據表


    列表例子展示了:

    1.    多列字段數據的展示(地區、省份、城市、種類、數量、金額)

    2.    支持多個列表字段值(數量、金額)

    3.    提供多列匯總統計、單元格合并(地區、省份、城市)

    除了以上的展示外還有以下功能:

    1.   小計、總計分別提供求平均值、記錄數,并允許自定義表達式方式對不同匯總字段進行單元格間的計算

    2.   小計、總計顯示風格上可以定義在維度字段、表格的最后,也允許定義在匯總字段、表格的最前

    3.   匯總的顯示默認是提供按行匯總統計,也可以按列匯總統計

    4.   字段值的顯示可以按照預先定義的模板格式化輸出

    5.   每個值、小計、總計可以設置顯示字體、字體大小、顏色、是否粗體、是否斜體

    11 固定列表

    固定表也是聯機開發的普通數據表,但是客戶只要需展示部分的數據,數據的選取規則由模板來確定

    比如:


    該模板是按照客戶需求只想展示白菜、青椒、土豆等水果蔬菜,下面的表單展示部分月的數據


    例子中可以看出固定列表繼承了列表的所有特性:

    1.   同樣支持多列數據展示

    2.   按照模板定義篩選數據

     

    12 靜態數據

    列表是面向靜態數據,如:報表表頭、固定日期

    如:前面一個圖的“OpenHandx蔬菜水果公司”

    13 圖表


    支持的圖表有AreaChart(區域圖)、BarChart(柱狀圖)、DialChart(儀表圖)、LineChart(折線圖)、PieChart(餅圖)、PolarChart(雷達圖)、RingChart(環狀圖)、ScatterChart(點圖)、WaterfallChart(瀑布圖),并支持圖表維度之間的匯總計算。

    下載地址:http://code.google.com/p/openhandx2/downloads/list

    posted on 2010-02-27 16:33 彭明華 閱讀(3434) 評論(39)  編輯  收藏 所屬分類: OpenHandX工具

    FeedBack:
    # re: OpenHandX-Report 1.0 2010-02-28 12:19 小山羊
    能不能不用配置文件及模板,直接通過web設置行和列及顯示數據字段,然后通過OpenHandX-Report動態生成excel報表?  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-02-28 12:21 小山羊
    比較喜歡海量數據的支持。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-01 18:20 彭明華
    @小山羊
    可以,最終客戶可以把模板和配置文件通過web文件上傳到服務器,由服務器動態生成報表。OpenHandX-Report的配置還支持配置類的方式,您還可以把配置信息直接保存到數據庫,并做出一個人性化的界面由最終客戶維護  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-02 14:12 小山羊
    太好了,最近也正要給金融做這方面的報表,能不能先發一下源碼研究一下(zhaohongjian2000@126.com)。謝謝了!  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-02 16:00 彭明華
    @小山羊
    文章最后提供了下載地址  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-04 10:46 小山羊
    最近正在研究 OpenHandX-Report 1.0、chart及Common源碼,我想問問,針對您說的“把配置信息直接保存到數據庫,并做出一個人性化的界面由最終客戶維護 ”,下載的包中有沒有這沒有例子,沒有的話,能不能提供個簡單的例子,謝謝了!真的很期待......  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-04 17:40 彭明華
    @小山羊
    這個例子沒有,如果做到人性化的工作量還不少,不過思路我可以說說。因為open-report的配置支持open.report.config.Config的實例。因此人性化的界面就是對一個Config里的內容做增刪改查。比如:首先主頁面應該是所有報表的列表,每個報表對應一個Excel模板(上傳的Excel文件)、配置(對應到Config的子表)、數據源(下拉列表:與業務數據接口的實現類對應)。點連接進入報表的維護界面,包括上傳Excel文件,配置數據源,config詳細配置按鈕。點按鈕進入Config配置。Config是由Sheet組成,因此是Sheet的列表,對Sheet增刪查(Sheet的index、name、Text等)。sheet又包括多個Tab或chart,因此又列出Sheet下的Tab或Chart,再對Tab或Chart進行維護。
    如果將這些配置做成圖形化配置就更好了。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-05 09:29 小山羊
    謝謝,我還是根據你目前的例子,一步步熟悉吧!  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-07 14:22 小山羊
    請問能不能單獨發一下文檔中的Config.xml,文檔中的打不開,zhaohongjian2000@126.com  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 09:19 小山羊
    有個問題請教一下,因為我看到源碼里,其中有幾個從數據庫讀取數據。我想問的就是如果我從數據庫中讀取數據(select * from tb)后,剩下的工作就交給open-report來做了(如:sum,count,求唯一,計數)?  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 16:02 小山羊
    今天在web工程下寫了個例子,按照您的寫法new CrossTabOut().write(wb,wb.getSheetAt(0),configs,rsvo);這句在web工程下出錯?有其它解決辦法嗎?  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 16:37 小山羊
    POIFSFileSystem fs = null;
    HSSFWorkbook wb = null;
    String src = "D:/openhandx/report/test.xls";
    try {
    fs = new POIFSFileSystem(new FileInputStream("d:/openhandx/report/test2.xls"));
    wb = new HSSFWorkbook(fs);
    wb.getSheetAt(0);

    CrossTab configs = new CrossTab();
    configs.setValueType(CrossTab.VALUETYPE_LENGTHWAYS);
    configs.setX(1);
    configs.setY(1);
    configs.setValueField(getValueField());
    configs.setRowField(getRowField());
    configs.setColField(getColField());

    configs.setStatField(new ArrayList<CrossStatField>());
    CrossStatField crossStatField = new CrossStatField();
    crossStatField.setText("總計");
    crossStatField.setFont(new Font());
    crossStatField.getFont().setColor((short)4);
    configs.getStatField().add(crossStatField);

    IRecordSetVO rsvo = getCrossData();
    System.out.println(rsvo);
    new CrossTabOut().write(wb,wb.getSheetAt(0),configs,rsvo);
    wb.write(new FileOutputStream("d:\\Book5.xls"));
    } catch (Exception e) {
    e.printStackTrace();
    }

      回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 16:46 小山羊
    出現的錯誤:
    Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.poifs.filesystem.POIFSFileSystem.hasPOIFSHeader(Ljava/io/InputStream;)Z
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:59)
    at open.report.excel.ExcelOutput.write(ExcelOutput.java:276)
    at open.report.excel.ExcelOutput.write(ExcelOutput.java:198)
    at open.report.excel.ExcelOutput.write(ExcelOutput.java:119)
    at cn.com.awms.report.ReportTest.main(ReportTest.java:41)  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 16:57 小山羊
    上面出的錯誤是另外一個,程序如下:
    static public void main(String[] args) throws Exception{
    String src = "D:/openhandx/report/test2.xls";
    try {
    Config config = new Config();
    Sheet sheet = new Sheet();
    sheet.setCrossTab(new ArrayList<CrossTab>());
    sheet.getCrossTab().add(getCrossConfig());
    config.setSheet(new ArrayList<Sheet>());
    config.getSheet().add(sheet);
    MulripleVO mvo = new MulripleVO();
    mvo.addRecordSet("cross", getCrossData());
    ExcelOutput.write(src,config,mvo,"d:\\Book10.xls");
    } catch (Exception e) {
    e.printStackTrace();
    }

    }  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 16:57 小山羊
    以上都是在web工程下運行的。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 19:38 彭明華
    @小山羊
    是這樣的  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-09 19:44 彭明華
    @小山羊
    是否能將你試驗的代碼和xml配置文件,rsvo的System.out的結果發過來  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-10 08:25 小山羊
    以下是整個代碼:
    package open.report.excel.crosstab;

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.List;

    import open.model.Field;
    import open.model.IRecordSetVO;
    import open.model.ModelException;
    import open.model.RecordSetVO;
    import open.model.RecordVO;
    import open.report.config.sheet.CrossTab;
    import open.report.config.sheet.crosstab.ColField;
    import open.report.config.sheet.crosstab.CrossStatField;
    import open.report.config.sheet.crosstab.RowField;
    import open.report.config.sheet.common.CrossValueField;
    import open.report.config.sheet.common.Font;
    import open.report.config.sheet.common.StatField;
    import open.report.excel.tab.CrossTabOut;

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;

    public class ReportSample {

    /**
    * @param args
    */
    static public void main(String[] args) throws Exception{
    POIFSFileSystem fs = null;
    HSSFWorkbook wb = null;
    try {
    fs = new POIFSFileSystem(new FileInputStream("d:/openhandx/report/test2.xls"));
    wb = new HSSFWorkbook(fs);
    wb.getSheetAt(0);

    CrossTab configs = new CrossTab();
    configs.setValueType(CrossTab.VALUETYPE_LENGTHWAYS);
    configs.setX(1);
    configs.setY(1);
    configs.setValueField(getValueField());
    configs.setRowField(getRowField());
    configs.setColField(getColField());

    configs.setStatField(new ArrayList<CrossStatField>());
    CrossStatField crossStatField = new CrossStatField();
    crossStatField.setText("總計");
    crossStatField.setFont(new Font());
    crossStatField.getFont().setColor((short)4);
    configs.getStatField().add(crossStatField);

    IRecordSetVO rsvo = getData();
    System.out.println(rsvo);
    new CrossTabOut().write(wb,wb.getSheetAt(0),configs,rsvo);
    wb.write(new FileOutputStream("d:\\Book5.xls"));

    } catch (Exception e) {
    e.printStackTrace();
    }

    }
    //設置行
    public static RowField getRowField(){
    RowField rowField = new RowField();
    rowField.setName("Name");
    return rowField;
    }
    //設置列
    public static ColField getColField(){
    ColField colField = new ColField();
    colField.setName("School");
    return colField;
    }
    //交叉表字段配置
    public static List<CrossValueField> getValueField(){
    List<CrossValueField> valueFields = new ArrayList<CrossValueField>();
    CrossValueField valueField = new CrossValueField();
    valueField.setName("Salary");
    valueFields.add(valueField);
    return valueFields;
    }
    //數據
    public static IRecordSetVO getData() throws ModelException{
    IRecordSetVO rsvo = new RecordSetVO();
    //添加數據列
    rsvo.addField("Name", Field.DataType.STRING);
    rsvo.addField("Sex",Field.DataType.STRING);
    rsvo.addField("School",Field.DataType.STRING);
    rsvo.addField("Salary",Field.DataType.BIGDECIMAL);

    //添加數據
    RecordVO rvo = new RecordVO();
    rvo.add("Name", "張三");
    rvo.add("Sex", "男");
    rvo.add("School", "博士");
    rvo.add("Salary", 10000);
    rsvo.add(rvo);
    rvo = new RecordVO();
    rvo.add("Name", "李四");
    rvo.add("Sex", "女");
    rvo.add("School", "研究生");
    rvo.add("Salary", 7000);
    rsvo.add(rvo);
    rvo = new RecordVO();
    rvo.add("Name", "王二");
    rvo.add("Sex", "男");
    rvo.add("School", "本科");
    rvo.add("Salary", 4200);
    rsvo.add(rvo);
    rvo = new RecordVO();
    rvo.add("Name", "劉三");
    rvo.add("Sex", "男");
    rvo.add("School", "研究生");
    rvo.add("Salary", 6200);
    rsvo.add(rvo);
    rvo = new RecordVO();
    rvo.add("Name", "小紅");
    rvo.add("Sex", "女");
    rvo.add("School", "博士");
    rvo.add("Salary", 9200);
    rsvo.add(rvo);
    rvo = new RecordVO();
    rvo.add("Name", "小劉");
    rvo.add("Sex", "女");
    rvo.add("School", "本科");
    rvo.add("Salary", 5200);
    rsvo.add(rvo);
    rvo = new RecordVO();
    rvo.add("Name", "小光");
    rvo.add("Sex", "男");
    rvo.add("School", "大專");
    rvo.add("Salary", 2200);
    rsvo.add(rvo);
    return rsvo;
    }
    }
      回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-10 08:28 小山羊
    其中d:/openhandx/report/test2.xls為空模板,里面什么也沒有,輸出結果為:3fc2d80d-bbdd-4c78-9cce-88a867c46b0f
    [Name:STRING, Sex:STRING, School:STRING, Salary:BIGDECIMAL]
    {Name=張三,Sex=男,School=博士,Salary=10000}00ae2d58-95ef-465c-a061-a64a83633f11
    {Name=李四,Sex=女,School=研究生,Salary=7000}097baf0d-64ef-4d55-9425-94c5a551f890
    {Name=王二,Sex=男,School=本科,Salary=4200}41dd8132-fe81-4735-a97a-f616cd27f0b6
    {Name=劉三,Sex=男,School=研究生,Salary=6200}96f54a36-a7b5-4094-b66a-922f1cd4b86a
    {Name=小紅,Sex=女,School=博士,Salary=9200}704c9f01-c184-44af-8b2f-0d93d3d86084
    {Name=小劉,Sex=女,School=本科,Salary=5200}afa6627c-f769-4ddd-b774-9f52677a2de1
    {Name=小光,Sex=男,School=大專,Salary=2200}b0cc4171-518d-4b67-9297-cb929b8dbe31

    本來這個類是在web工程下創建的,但是new CrossTabOut().write(wb,wb.getSheetAt(0),configs,rsvo); 出現錯誤,所以無法運行,然后我把它Copy到java工程中就沒有問題了。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-10 08:30 小山羊
    而且沒有用到xml配置文件。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-10 08:30 小山羊
    請問您在web工程中是怎樣使用的?  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-10 10:02 小山羊
    問題解決了,剛才又創建了幾個web工程,運行沒有問題,看樣我的那個web工程太久了。不知道怎么回事。謝謝!  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-10 13:34 彭明華
    @小山羊
    好的,有問題就貼出來  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-15 10:38 小山羊
    在配置文件中
    - <rowField name="area">
    - <rowField name="province">
    <rowField name="city" defaultField="cityid" />
    - <statField type="0" text="_value_小計" fill="0">
    <font strikeout="-1" typeOffset="-1" name="Arial Unicode MS" size="12" color="57" italic="false" bold="false" />
    </statField>
    </rowField>
    - <statField type="0" text="_value_小計" fill="0">
    <font strikeout="-1" typeOffset="-1" name="Arial Unicode MS" size="12" color="2" italic="false" bold="false" />
    </statField>
    </rowField>

    其中在<rowField name="city" defaultField="cityid" /> 什么意思?為什么指定了city之后,還要默認字段cityid?  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-15 22:18 彭明華
    @小山羊
    cityid是city的主鍵,是唯一值,如果指定cityid之后就會根據cityid來分組(未指定會根據city分組),如果數據庫存在不同的城市而名字相同(目前中國不會)肯定會帶來分組的錯誤,因為報表工具是通用工具為了應對各種情況(復合主鍵也支持),所以用cityid會更嚴格更可靠。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-16 12:57 小山羊
    妥了。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-19 11:13 小山羊
    IRecordSetVO rsvo = getData();

    rsvo = rsvo.sort(SORTTYPE.asc, new String[]{"CURRENCY_CD"});
    rsvo = rsvo.sort(SORTTYPE.asc, new String[]{"INTERNAL_ORG_ID"});

    上邊是對“列字段”和“行字段”排序,結果只能一個字段排序,能不能即能實現行排序,有能實現列排序呢?  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-19 14:08 彭明華
    @小山羊
    如果是對報表的排序直接在報表配置設置就可以了,報表會自動按照分組的順序進行排序。
    如果僅是對數據的多字段排序
    rsvo.sort(SORTTYPE.desc, "field1","field2","field3"。。。);
      回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-03-31 16:41 小山羊
    請問在交叉表中,怎樣加入表達式計算,我加了幾次都不成功。
    2010-03-31 16:39:36,578 [main] DEBUG open.model.calculate.CrossCalculate - 'Salary*2' expression makes mistakes in the Salary(City:上海,Name:小光)
    open.calculate.CalculateException: Calculate 'Salary*2' error
    at open.calculate.Calculator.eval(Calculator.java:275)
    at open.calculate.Calculator.eval(Calculator.java:198)
    at open.model.calculate.CrossCalculate.evalCol(CrossCalculate.java:473)
    at open.report.calculate.CrossCalculate.evalCol(CrossCalculate.java:116)
    at open.report.excel.tab.CrossTabOut.setCellStatValue(CrossTabOut.java:962)
    at open.report.excel.tab.CrossTabOut.writeRowStatData(CrossTabOut.java:533)
    at open.report.excel.tab.CrossTabOut.writeRowStatData(CrossTabOut.java:530)
    at open.report.excel.tab.CrossTabOut.writeRowStat(CrossTabOut.java:474)
    at open.report.excel.tab.CrossTabOut.write(CrossTabOut.java:159)
    at open.report.excel.crosstab.ReportSample.main(ReportSample.java:73)



    代碼如下:
    static public void main(String[] args) throws Exception{
    POIFSFileSystem fs = null;
    HSSFWorkbook wb = null;
    try {
    fs = new POIFSFileSystem(new FileInputStream("d:/openhandx/report/test2.xls"));
    wb = new HSSFWorkbook(fs);
    wb.getSheetAt(0);

    CrossTab configs = new CrossTab();
    configs.setValueType(CrossTab.VALUETYPE_LENGTHWAYS);
    configs.setX(1);
    configs.setY(1);
    configs.setValueField(getValueField());
    configs.setRowField(getRowField());
    configs.setColField(getColField());

    configs.setStatField(new ArrayList<CrossStatField>());
    CrossStatField crossStatField = new CrossStatField();
    crossStatField.setText("總計");
    crossStatField.setFont(new Font());
    crossStatField.getFont().setColor((short)4);
    crossStatField.getFont().setBold(true);
    configs.getStatField().add(crossStatField);


    crossStatField = new CrossStatField();
    crossStatField.setText("平均值");
    crossStatField.setType(CrossStatField.TYPE_AVG);
    configs.getStatField().add(crossStatField);

    crossStatField = new CrossStatField();
    crossStatField.setText("比例");
    crossStatField.setType(CrossStatField.TYPE_EXPRESSION);
    crossStatField.setExpression("Salary*2");
    crossStatField.setFill(CrossStatField.FILL_LAST);
    configs.getStatField().add(crossStatField);

    IRecordSetVO rsvo = getData();
    //CrossCalculate c = new CrossCalculate(rsvo,getRowField(),getColField(),0);
    //CrossCalculate c = new CrossCalculate(rsvo,getRowField(),getColField(),0);
    System.out.println(rsvo);
    new CrossTabOut().write(wb,wb.getSheetAt(0),configs,rsvo);
    wb.write(new FileOutputStream("d:\\Book5.xls"));

    } catch (Exception e) {
    e.printStackTrace();
    }

    }  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2010-04-08 15:21 彭明華
    @小山羊
    表達式變量不允許使用比它當前位置小的集合進行計算,只允許比它當前大的或等于的集合進行計算
    權值為:總計>一級小計>二級小計...>度量值,因此只有度量值的表達式變量可以用到任何度量列,任何小計和總計,同樣的道理總計只能用到總計自己總計、總記錄數、總平均值等變量
    這么做是因為,某行列的度量值的二級小計、一級小計、總計都只能有一個。同樣的二級小計的一級小計、總計也都只能有一個。反過來就不一樣了,一個小計里有多個度量值(范圍內的多個度量值匯總就是小計),無法定位更無法計算。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2011-04-19 17:23 嗨嗨
    已經下載了,正在學習中,不過發現report的例子需要mysql的數據庫,下載包中好像是沒有哦,例子不能運行??!  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2011-04-19 20:54 彭明華
    @嗨嗨
    我在開發中確實是以mysql數據庫測試的,發布的時候就把mysql的jdbc jar刪除了。OpenHandX-Report 本身不依賴任何數據庫的,你可以根據自己的情況下載合適的數據庫jdbc jar用于測試。  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2011-04-20 10:12 嗨嗨
    是測試用的數據庫report沒有了,沒有測試數據,無法運行哦,jdbc jar是數據庫的驅動啊  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2011-04-24 11:27 彭明華
    @嗨嗨
    抱歉,數據庫數據找不到了,我近期找個時間補一下demo數據,您多關注一下  回復  更多評論
      
    # re: OpenHandX-Report 1.0 2011-04-24 16:55 彭明華
    @嗨嗨
    新做了一份測試數據,請下載
    http://code.google.com/p/openhandx/downloads/list
      回復  更多評論
      
    # re: OpenHandX-Report 1.0 2011-04-27 17:36 嗨嗨
    @彭明華
    呵呵,謝謝,不過我使用了自己的數據庫做例子,現在已經運行了一個了,已經開始學習了,用起來還是很簡單。等用你的例子再試一下  回復  更多評論
      
    # re: OpenHandX-Report 1.01 2016-04-14 16:38 木葉子夏
    @小山羊 我也遇到了你這個錯誤,想請問一下你是怎么解決的,相關jar包什么的我看都有的
      回復  更多評論
      
    # re: OpenHandX-Report 1.01 2016-04-14 16:40 小山羊
    下面是報錯信息,麻煩幫忙看一下:
    java.lang.NoSuchMethodError: org.apache.poi.poifs.filesystem.POIFSFileSystem.hasPOIFSHeader(Ljava/io/InputStream;)Z
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:59)
    at com.sinosoft.batchclaim.servlet.NoCarFileUploadServlet.getWorkbook(NoCarFileUploadServlet.java:285)
    at com.sinosoft.batchclaim.servlet.NoCarFileUploadServlet.read(NoCarFileUploadServlet.java:250)
    at com.sinosoft.batchclaim.servlet.NoCarFileUploadServlet.saveUploadInfor(NoCarFileUploadServlet.java:231)
    at com.sinosoft.batchclaim.servlet.NoCarFileUploadServlet.doBusiness(NoCarFileUploadServlet.java:79)
    Truncated. see log file for complete stacktrace
    >   回復  更多評論
      
    # re: OpenHandX-Report 1.01 2016-05-11 12:12 pengminghua
    @小山羊
    你用的是哪個版本的POI?也可能是新版POI依賴更多的jar  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 4hu四虎免费影院www| 人妻无码久久一区二区三区免费| 亚洲精品456播放| 国产精品视频白浆免费视频| 亚洲五月综合缴情婷婷| 免费A级毛片无码A| 99爱免费观看视频在线| 亚洲爆乳少妇无码激情| 亚洲VA成无码人在线观看天堂| 国拍在线精品视频免费观看| 午夜在线免费视频| 亚洲一区二区三区亚瑟| 亚洲国产综合无码一区二区二三区| 一区二区免费视频| 猫咪免费观看人成网站在线| 亚洲黄色免费电影| 亚洲日韩中文在线精品第一| 91免费资源网站入口| 91视频精品全国免费观看| 亚洲日本在线电影| 亚洲一区免费观看| 亚洲一级Av无码毛片久久精品| 免费专区丝袜脚调教视频| 久久国产福利免费| 亚洲精品av无码喷奶水糖心| 久久精品国产亚洲AV麻豆网站| 全部免费国产潢色一级| 亚洲性线免费观看视频成熟 | 亚洲首页国产精品丝袜| 精品国产日韩亚洲一区| 永久免费观看的毛片的网站| 99热这里有免费国产精品| 国产午夜不卡AV免费| 日本一区二区三区免费高清在线| 亚洲一级毛片免费观看| 亚洲国产精品不卡在线电影| 国产亚洲精品自在久久| 亚洲精品和日本精品| 国产乱弄免费视频| 精品免费国产一区二区三区| 男女免费观看在线爽爽爽视频|