隨筆 - 11  文章 - 79  trackbacks - 0
          <2016年4月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          歡迎合作

           

          聯系方式: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 彭明華 閱讀(3439) 評論(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  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 西乌珠穆沁旗| 奉新县| 班玛县| 杭州市| 句容市| 垫江县| 莎车县| 长治市| 勃利县| 团风县| 黄梅县| 虞城县| 东阳市| 怀化市| 旺苍县| 昭平县| 锡林郭勒盟| 泸定县| 宣城市| 综艺| 剑河县| 南汇区| 柯坪县| 罗田县| 曲阜市| 龙泉市| 永福县| 涞源县| 南澳县| 邯郸县| 竹溪县| 玛沁县| 女性| 页游| 建湖县| 木兰县| 潮州市| 工布江达县| 扎囊县| 云南省| 开远市|