随笔 - 11  文章 - 79  trackbacks - 0
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

欢迎合作

 

联系方式: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 彭明华 阅读(3420) 评论(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  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问