报表的数据来源多种多样,有时会接收来自HTTP服务器的数据进行报表展现,润乾报表工具需要通过自定义数据源使用高级语言(JAVA)进行处理,这里通过一个实例说明润乾报表的实现过程及改进方式。
报表描述
学生成绩信息存储在远程的JSON格式文件中,其所在HTTP服务器对外提供统一HTTP访问接口,现需要根据学科参数查询指定科目学生成绩,并按学生成绩降序排列。报表样式如下:
润乾报表实现
自定义数据集
首先通过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;
报表调用
报表使用自定义数据集类型:
设置报表模板及表达式:
润乾报表支持自定义数据集,开发人员可以通过Java程序自由实现读取远程HTTP文件作为报表数据源。但过于依赖Java编程无疑增加了报表开发的难度,本例中首先要实现读取远程HTTP文件的方法,接着要借助解析json文件的jar包完成解析,还要在Java程序中完成数据排序等计算目标,而当包含分组、连接等计算时程序的复杂度会陡然上升,对报表开发人员来说都是不小的挑战。当然也可以用报表工具来完成排序等运算,但这样会导致占用较大的内存(特别是有过滤动作时,需要把数据都取到报表端再执行过滤),性能也会受到较大影响,有许多复杂的文件操作也会超出报表计算能力范围。
这种情况下,采用润乾报表基础上的计算强化版集算报表将是更好的选择。集算报表支持远程HTTP数据源,还能直接处理json数据,可以快速完成此类报表的开发。本例在集算报表中可以这样完成。
集算报表实现
编写集算脚本
首先使用集算完成文件读入和排序,集算脚本如下:
A1:使用httpfile函数将url的返回结果封装成文件流返回
A2:从json格式串中导入并解析出序表
A3:根据学科参数subject拼出数据过滤表达式串
A4:解析表达式并完成数据过滤
A5:按成绩降序排列,结果通过A6返回
报表调用
数据集设置
集算报表中使用集算器数据集类型,选择上面编辑好的集算器脚本文件(fromJSON.dfx):
其中参数名subject为集算脚本参数,参数值subject为报表参数。
报表模板及表达式
通过上述实现过程可以看到,与润乾报表需要自定义数据集通过Java程序实现不同,集算器通过几行代码即可完成对远程HTTP文件的读取和展现,比起几百行的Java程序要简单很多。集算报表可以直接使用远程HTTP文件使得文件具备了再计算(过滤、分组、排序等)的能力,在集算报表中开发此类报表将非常简单。
此外,当集算脚本比较简单的时候,可以直接使用集算报表内置的脚本数据集,将脚本直接嵌入到报表模板中,而不必在单独在集算器中完成。实现方式如下:
1、在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”:
2、在弹出的脚本数据集编辑窗口中编写集算脚本:
3、报表调用,与其他数据集使用方式一致,不再赘述。