java 获取润乾报表_润乾报表远程HTTP数据源方法及改进

本文介绍了如何使用Java获取润乾报表的远程HTTP数据源,包括读取JSON文件、解析数据、排序,以及面临的问题。提出采用集算报表作为改进方案,简化开发过程,提高性能。
摘要由CSDN通过智能技术生成

报表的数据来源多种多样,有时会接收来自HTTP服务器的数据进行报表展现,润乾报表工具需要通过自定义数据源使用高级语言(JAVA)进行处理,这里通过一个实例说明润乾报表的实现过程及改进方式。

报表描述

学生成绩信息存储在远程的JSON格式文件中,其所在HTTP服务器对外提供统一HTTP访问接口,现需要根据学科参数查询指定科目学生成绩,并按学生成绩降序排列。报表样式如下:

a4c26d1e5885305701be709a3d33442f.png

润乾报表实现

自定义数据集

首先通过java.net读取远程HTTP文件,由于要读取的是json格式文件,需要再使用JSONObeject解析json文件内容。以下为实现步骤:

1、 读取远程HTTP文件,返回文件内容字符串

publicstaticString

readFile(String strUrl) {

URLurl =null;

HttpURLConnectionurlc =null;

BufferedInputStreambufferedInput =null;

byte[]

buffer =newbyte[1024];

String result = “”;

try{

url =newURL(strUrl);

urlc = (HttpURLConnection) url.openConnection();

urlc.getInputStream();

// 创建BufferedInputStream对象

bufferedInput =newBufferedInputStream(urlc.getInputStream());

intbytesRead

= 0;

// 从文件中按字节读取内容,到文件尾部时read方法将返回-1

while((bytesRead

= bufferedInput.read(buffer)) != -1) {

// 将读取的字节转为字符串对象

result +=newString(buffer,

0, bytesRead);

}

}catch(Exception

e) {

e.printStackTrace();

}

returnresult;

}

2、 定义学生成绩类,用于存储学生信息

publicclassScore

{

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

String

className;

String

id;

String

studentName;

String

subject;

String

score;

}

3、 在自定义数据集中接收并解析报表参数

Mapmap =

ctx.getParamMap(false);

String subject =

map.get(“subject”).toString();//统计科目

4、 解析指定json字符串,并将其内容存入list

List list =newArrayList();

String JsonContext =readFile(“http://192.168.1.103:8080/score2.json”);

JSONArrayjsonArray =

JSONArray.fromObject(JsonContext);

intsize

= jsonArray.size();

// json內容以Score格式存入list

for(inti

= 0; i < size; i++) {

JSONObjectjo = jsonArray.getJSONObject(i);

if(jo.getString(“subject”).equals(subject)

|| jo.getString(“subject”) == subject)

list.add(newScore(jo.getString(“className”),

jo

.getString(“id”), jo.getString(“name”), jo

.getString(“subject”), jo.getString(“score”)));

}

5、 定义排序类,实现compare方法比较学生成绩

public

classComparatorScoreimplementsComparator

{

publicintcompare(Object

o1,Object o2){

Score score1 = (Score)o1;

Score score2 = (Score)o2;

returnscore2.getScore().compareTo(score1.getScore());

}

}

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

ComparatorScorecs =newComparatorScore();

Collections.sort(list, cs);

7、 构造数据集,并设置数据集数据

//

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

DataSetds1

=newDataSet(“ds1″);

ds1.addCol(“className”);

ds1.addCol(“id”);

ds1.addCol(“name”);

ds1.addCol(“subject”);

ds1.addCol(“score”);

// 设置数据集中的数据

for(inti

= 0; i

Score score = list.get(i);

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

rr.setData(1, score.getClassName());

rr.setData(2, score.getId());

rr.setData(3, score.getStudentName());

rr.setData(4, score.getSubject());

rr.setData(5, score.getScore());

}

returnds1;

报表调用

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

a4c26d1e5885305701be709a3d33442f.png

设置报表模板及表达式:

a4c26d1e5885305701be709a3d33442f.png

润乾报表支持自定义数据集,开发人员可以通过Java程序自由实现读取远程HTTP文件作为报表数据源。但过于依赖Java编程无疑增加了报表开发的难度,本例中首先要实现读取远程HTTP文件的方法,接着要借助解析json文件的jar包完成解析,还要在Java程序中完成数据排序等计算目标,而当包含分组、连接等计算时程序的复杂度会陡然上升,对报表开发人员来说都是不小的挑战。当然也可以用报表工具来完成排序等运算,但这样会导致占用较大的内存(特别是有过滤动作时,需要把数据都取到报表端再执行过滤),性能也会受到较大影响,有许多复杂的文件操作也会超出报表计算能力范围。

这种情况下,采用润乾报表基础上的计算强化版集算报表将是更好的选择。集算报表支持远程HTTP数据源,还能直接处理json数据,可以快速完成此类报表的开发。本例在集算报表中可以这样完成。

集算报表实现

编写集算脚本

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

a4c26d1e5885305701be709a3d33442f.png

A1:使用httpfile函数将url的返回结果封装成文件流返回

A2:从json格式串中导入并解析出序表

A3:根据学科参数subject拼出数据过滤表达式串

A4:解析表达式并完成数据过滤

A5:按成绩降序排列,结果通过A6返回

报表调用

数据集设置

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

a4c26d1e5885305701be709a3d33442f.png

其中参数名subject为集算脚本参数,参数值subject为报表参数。

报表模板及表达式

a4c26d1e5885305701be709a3d33442f.png

通过上述实现过程可以看到,与润乾报表需要自定义数据集通过Java程序实现不同,集算器通过几行代码即可完成对远程HTTP文件的读取和展现,比起几百行的Java程序要简单很多。集算报表可以直接使用远程HTTP文件使得文件具备了再计算(过滤、分组、排序等)的能力,在集算报表中开发此类报表将非常简单。

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

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

a4c26d1e5885305701be709a3d33442f.png

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

a4c26d1e5885305701be709a3d33442f.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值