需求背景
中软重大工程部的国家安全生产应急救援指挥中心应急平台建设软件开发项目,有一个在超图上展示润乾统计图的需求.
解决方案:
和客户讨论后的想到的解决方案:
1:获取报表运算后的结果集,客户根据获取的结果集用自己的方法画图
2:通过自定义统计图方式,利用统计图属性面板中的定义的分类轴,系列,运算后将数据保存成xml或者其它对象中。
3:获取后台生成的统计图,再通过开发处理放到地图上
方案1:
缺点:问题在于如何获取结果集,润乾报表可以通过context.getDataSet(‘ds’)来获取数据集中的数据,但是报表单元格运算后的数据,没有一个统一的方法得到,只能通过遍历单元格来实现,拼成想要的格式串,故除非报表格式统一,否则代码量稍大,客户可能不会选择。
方案2:
从客户的需求来考虑,想要的数据其实就是生成统计图所需要的数据,所以可以通过自定义统计图的方式,获取到计算后的数据,以自己想要的格式将数据保存到xml或者其它对象中。此种方法非常类似于润乾报表集成fusioncharts中生成xml的代码,只需修改,按照项目需求获取数据即可。
方案3:
此方案是客户提出,希望我们能将报表计算后生成统计图图片,客户再做开发处理生成其想要的效果。
方案2已经给客户讲过,客户反馈会研究下,目前希望能帮其实现方案3的代码
实现代码
思路:
润乾报表在计算之后,生成IReport对象,遍历单元格找到统计图所在位置,获取值并强制转化成ImageValue对象,最后将二进制数据流转化为图片
代码如下:
public static void main(String[] args) throws Throwable {
Areaarea = null;
int row = 0,col = 0;
Contextcxt = new Context();
Connectioncon = ImageFromReport.getConnection();
cxt.setDefDataSourceName("demo");
cxt.setConnection("demo", con);
StringreportPath = "D:\\ProgramFiles\\reportHome\\webapps\\demo\\reportFiles\\image.raq";
IReportrd = (ReportDefine) ReportUtils.read(reportPath);
Engineengine = new Engine(rd,cxt); // 构造报表引擎
IReportiReport = engine.calc();
//遍历单元格得到统计图所在单元格的位置,如果是合并格,只需得到合并格的起始行和起始列即可
for (int r = 1; r <=iReport.getRowCount(); r++) {
for (int c = 1; c <=iReport.getColCount(); c++) {
INormalCellim = iReport.getCell(r, (short) c);
//TYPE_GRAPH属性为统计图属性
if (im.TYPE_GRAPH ==im.getCellType()) {
if (im.isMerged()) {
area= im.getMergedArea();
}
}
}
}
//获取合并格的起始行和起始列
if(area !=null){
row=area.getBeginRow();
col=area.getBeginCol();
}
INormalCellgraph=iReport.getCell(row,(short) col);
//得到统计图对象并强制转化成ImageValue类型
ImageValue image=(ImageValue) graph.getValue();
byte[] b=image.getValue();
//输出文件
FileOutputStreamfileOutStream = new FileOutputStream("D:/A.jpg");
for(int i=0;i<b.length;i++)
{
fileOutStream.write(b[i]);
}
fileOutStream.flush();
}
总结:
统计图按照客户的要求生成了,对于润乾报表生成的数据,我们都可以通过代码在后台获取得到,至于客户的最终需求能否实现,还有待客户方面的反馈。不过可知的是,方法总会有的。