润乾报表使用EXCEL数据源的方法及改进

Excel作为一种常见的文件格式广泛存在,很多报表的数据来源于Excel。由于报表一般都带有参数,经常需要对原始数据进行分组、过滤等,都需要再编写程序代码才能满足有参数报表的查询需求。

润乾报表使用Excel数据源,需要用Java程序处理文件,通过自定义数据集为报表提供数据源支持。这里通过一个实例说明润乾报表实现过程,以及改进方式。

报表描述

基金公司将股票信息以每月一个Excel存储,命名方式为:stock_yyyyMM.xls。包括每只股票的股票编码、交易日期和收盘价,现报表参数为起始年月和结束年月,报表按照交易日排序,展现股票交易记录列表。

Excel内容如下:

报表格式如下:

润乾报表实现

自定义数据集

这里使用poi读取操作Excel,以下为实现步骤:

1、  定义股票信息类,用于存储股票交易信息

class Stock {

//省略构造函数和get set方法

private String code;

private String tradingDate;

private String price;

}

2、  在自定义数据集中接收并解析报表参数,判断使用哪些文件;

// 取得参数列表并分别取得它的参数名与值,宏与之类似

Mapmap = ctx.getParamMap(false);

int begin = Integer.parseInt(map.get("begin").toString());

int end = Integer.parseInt(map.get("end").toString());

for (int i = begin; i <= end;i++) {

System.out.println(i);

if (i % 100 > 0&& i % 100 < 13) {

StringfileName = "E:\\stock_" + i + ".xls";

System.out.println("Read "+ fileName + " startup...");

readExcel(fileName);//读入并解析Excel内容,并将结果存入List

}

}

3、  使用getCellValue()方法判断单元格格式,由于Excel会将日期按照numeric类型存储,所以要在程序中区分数值和日期,并完成相应转换

publicstatic StringgetCellValue(Cell cell) {

switch (cell.getCellType()) { // 根据cell中的类型来输出数据

case HSSFCell.CELL_TYPE_NUMERIC:

//解析自定义日期格式yyyy-mm-ddd

if(cell.getCellStyle().getDataFormat() == 184) {

SimpleDateFormatsdf = newSimpleDateFormat("yyyy-MM-dd");

double value =cell.getNumericCellValue();

Datedate = org.apache.poi.ss.usermodel.DateUtil

.getJavaDate(value);

return sdf.format(date);

}

returncell.getNumericCellValue() + "";

case HSSFCell.CELL_TYPE_STRING:

returncell.getStringCellValue();

case HSSFCell.CELL_TYPE_FORMULA:

returncell.getCellFormula().toString();

default:

returnnull;

}

}

4、实现读入Excel方法readExcel(),根据传入Excel文件名读入并解析,将文件内容存入List

publicstaticvoid readExcel(StringfileName) {

boolean isE2007 = false; // 判断是否是excel2007格式

if (fileName.endsWith("xlsx"))

isE2007= true;

try {

InputStreaminput = newFileInputStream(fileName); // 建立输入流

Workbookwb = null;

// 根据文件格式(2003或者2007)来初始化

if (isE2007)

wb= newXSSFWorkbook(input);

else

wb= newHSSFWorkbook(input);

Sheetsheet = wb.getSheetAt(0); // 获得第一个表单

Iterator<Row>rows = sheet.rowIterator(); // 获得第一个表单的迭代器

Stringcode = null;

Stringdate = null;

Stringprice = null;

while (rows.hasNext()) {

Rowrow = rows.next(); // 获得行数据

Iterator<Cell>cells = row.cellIterator(); // 获得第一行的迭代器

while (cells.hasNext()) {

Cellcell = cells.next();

System.out.println("Cell #"+ cell.getColumnIndex());

switch (cell.getColumnIndex()){

case 0:

code= getCellValue(cell);

break;

case 1:

date= getCellValue(cell);

break;

case 2:

price= getCellValue(cell);

break;

}

}

if (row.getRowNum() == 0){

colList.add(new Stock(code, date,price));

}else{

list.add(new Stock(code, date,price));

}

}

}catch(IOException ex) {

ex.printStackTrace();

}

}

5、定义排序类,实现compare方法比较交易日期

publicclass ComparatorStock implementsComparator {

publicint compare(Objecto1,Object o2){

Stockstock1 = (Stock)o1;

Stockstock2 = (Stock)o2;

returnstock1.getTradingDate().compareTo(stock2.getTradingDate());

}

}

6、使用Collections.sort完成List排序

ComparatorStockcs = newComparatorStock();

Collections.sort(list,cs);

7、创建数据集,并根据排序后List内容设置数据集数据

// 构造一个数据集ds1,设置列名

DataSetds1 = newDataSet("ds1");

Stockcol = colList.get(0);

ds1.addCol(col.getCode());

ds1.addCol(col.getTradingDate());

ds1.addCol(col.getPrice());

// 设置数据集中的数据

for (int i = 1; i <list.size(); i++) {

Stockstock = list.get(i);

com.runqian.report4.dataset.Rowrr = ds1.addRow();

rr.setData(1,stock.getCode());

rr.setData(2,stock.getTradingDate());

rr.setData(3,stock.getPrice());

}

return ds1;

报表调用

报表使用自定义数据集类型:

设置报表模板及表达式:

通过自定义数据集后在报表中调用可以完成本例的报表需求,润乾报表支持用户自定义数据集处理数据,体现了极大的灵活性。但过于依赖Java编程无疑增加了报表开发的难度,本例只是简单的完成了文件读取和排序,当包含分组、连接等计算时程序的复杂度会陡然上升,对报表开发人员来说都是不小的挑战。当然也可以用报表工具来完成排序等运算,但这样会导致占用较大的内存(特别是有过滤动作时,需要把数据都取到报表端再执行过滤),性能也会受到较大影响,有许多复杂的文件操作也会超出报表计算能力范围。

这种情况下,采用润乾报表基础上的计算强化版集算报表将是个不错的选择。集算报表内置的集算器对Excel文件读取的先天支持可以帮助集算报表快速完成Excel数据源报表。本例在集算报表中可以这样完成。

集算报表实现

首先使用集算完成文件读入和排序,集算脚本如下:

A1:根据起始结束月份参数列出中间包含的月份

A2:根据A1的计算结果,逐个读入月份文件,并将结果合并

A3:为报表返回按照交易日期排序后结果

报表调用

数据集设置

集算报表中使用集算器数据集类型,选择上面编辑好的集算器脚本文件(fromExcel.dfx):

其中b、e为报表参数,begin、end为集算脚本参数.

报表模板及表达式

通过上面的步骤可以看到,使用集算报表完成Excel数据源报表非常简单,既不需要大量的Java编程,也不必为到底选用何种方式(poi、jxl、jcom)操作Excel而费心。集算器脚本只需要3行即可完成计算过程,而同样的计算任务Java程序则需要几百行。集算报表让文件拥有了计算能力,使得开发文件数据源报表更为简单方便。

此外,如果集算脚本比较简单,可以直接使用集算报表内置的脚本数据集(一种数据集类型),将脚本直接嵌入到报表模板中,而不必在单独在集算器中完成。实现方式如下:

1、在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”:

2、在弹出的脚本数据集编辑窗口中编写集算脚本:

脚本数据集中可以直接使用报表定义的参数,如上述脚本中的begin、end即为报表参数。

3、报表调用,与其他数据集使用方式一致,不再赘述。

时间: 2024-11-10 15:04:05

润乾报表使用EXCEL数据源的方法及改进的相关文章

润乾报表使用json数据源的方法改进

JSON作为一种轻量级数据格式应用非常广泛,报表读取json数据源进行报表开发的需求也很常见.润乾报表使用json数据源需要在自定义数据集中通过Java程序解析json文件后将结果集返回给报表,这里介绍润乾报表的实现方式以及改进方法. 报表需求 学生成绩在应用中以json文件存在,现需要根据学科参数查询指定科目学生成绩,并按学生成绩降序排列.报表样式如下: 润乾报表实现 自定义数据集 润乾报表中需要通过自定义数据集完成json文件的读取,实现过程如下: 1.  准备json解析依赖包 Java程

润乾报表 动态改变数据源

经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表. 实现动态数据源有多种方法:具体说两种使用过的方法:第一种:使用脚本集算器法 使用集算脚本编辑工具完成计算脚本,并为报表输出计算后结果集: A1:根据参数dbname参数值决定数据源 A2:编写查询SQL A3:执行sql取数 A4:关闭连接 A5:将结果集返回报表 优点:开发简单,理解方便.缺点:必须 集算器授权 第二种:TAG标签1.导包 1 <%@ page import=&qu

润乾报表实现动态数据源报表及改进

经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表.报表工具通常的做法有两种,一是不同的情况加载不同的数据源连接参数,如:url.driver.username.password等:二是利用已配置的多个连接池,根据不同情况选择.这里通过一个实例,说明润乾报表的实现过程及改进方案. 报表说明 应用中需要通过参数控制报表连接的数据源,当参数flag为1时连接数据源一(db1),否则连接数据源二(db2). 润乾报表实现 首先根据flag

润乾报表实现无数据源的规则报表及改进

某报表系统中有部分报表需要按照一定规则显示数据,如:显示查询日期范围内的奇数日数据,要求数据库中即使无记录该日期也显示(内容为空). 本文重点来实现奇数日期序列,数据区不是重点,故置空. 以上述报表需求为例,这里来看一下润乾报表的实现过程,以及改进方法. 润乾报表实现 以下为润乾报表的实现方式,考虑跨年和跨月份的情况: 使用时要对辅助列A列进行隐藏,以及对第2行进行条件隐藏,偶数的日期不显示.所以报表工具实现要依靠大量隐藏行列. 报表工具实现需要借助隐藏行格完成,主要原因是数据计算和报表呈现混在

润乾集算报表使用EXCEL数据源的示例

Excel作为一种常见的文件格式广泛存在,很多报表的数据来源于Excel.集算报表可以直接使用Excel作为数据源来开发报表.这里通过一个实例说明集算报表实现过程. 报表描述 基金公司的股票信息以每月一个Excel存储,命名方式为:stock_yyyyMM.xls.先需要查询一定周期内各支股票的最高最低收盘价,以及创下最高或最低收盘价的交易日期. 报表样式如下: 实现步骤 编写脚本 首先使用集算器完成Excel文件读取和数据计算,编写脚本(fromExcel.dfx). A1通过传入的起始结束月

润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:

一.润乾报表错误内容 产生数据工厂: com.runqian.report4.dataset.SQLDataSetFactory 失败 错误来源:: 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定: 二.解决方法 同事做的润乾报表.我来整合到系统中,在调试运行的时候都是用的同一个数据库,数据库链接也是开启的,但是就是连不上. 这个时候需要在配置菜单->数据集,如下图 重新选择一下数据源,然后保存,问题得到解决. 估计是因为用的不同的环境的,所以js中

润乾报表的组成和变迁

产品发展 润乾公司在润乾报表3.x中首次应用了非线性报表模型,并在该版本的实践过程中积累了丰富的工程化经验.在这些基础上开发出的润乾报表5.x,实现了理论模型和工程实践的完美结合,不仅保持原有的开发高效性,运算性能指标也有了大幅度提高,成为一款经典的报表工具软件. 产品在应用过程中不断有新的需求加入,而且在完善过程中也难以对仍在快速积累中的需求进行深入梳理,润乾报表5.x逐步发展成融合了固定报表.自助报表和填写表单这三项主要功能的庞大体系. 随着应用经验的进一步丰富,我们逐渐意识到,报表工具的这

集算报表与润乾报表的函数语法对照

集算报表5.0在保留润乾报表V4.x的核心功能外,进行了优化和精简.当中报表函数也做了适当优化,这里就常见计算来比較一下二者函数语法之间的差异.         对照函数一览表 1.数据集函数 1.1.ds.group()         润乾报表: datasetName.group(selectExp{,descExp{,filterExp{,sortExp{,groupSortExp{,groupDescExp{,rootGroupExp}}}}}})         集算报表: data

润乾报表实现跨行组运算报表及改进

跨行组计算类报表在报表开发中非常常见,如常见的同期比.环比计算.移动平均值计算等.这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表实现并不轻松.润乾报表在实现时需要借助层次坐标和位移坐标,辅以条件表达式和"$"运算符完成.下面通过一个实例说明润乾报表的实现方式. 报表需求 根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比.报表样式如下: 这里应该注意的是比去年同期是指与去年同月份的比值,无对应月份则为空:要求只显示本年数据. 润