动态改变报表前景图
之前有同事介绍过前景图,背景图的使用方式,也介绍过如何通过报表实现盖章的动作,本篇文章主要介绍的不是如何去实现盖章,而是根据业务需求,通过选择图片来实现具体要盖哪个章的问题,动态控制盖得是哪个章。当然前景图和背景图是类似的,前景图能够实现的动态控制,背景图也能实现。
本文举例为,一个已经设置好前景图的报表,根据需要,改变其中一个单元格前景图的内容。
实现动态的盖章。
实现步骤,1,首先得到一个已经盖好章的报表,如下
其中C2单元格内容为一前景图片
展示如下:
比如我想修改急速快递的盖章,如何做呢?
这里需要用api来实现:
首先读入报表并计算:
String reportFile = “C:/test.raq”; //该文件名可以为绝对路径,也可以相对当前程序启动路径
ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
Context cxt = new Context();
Engine engine = new Engine(rd, cxt); //构造报表引擎
其次得到计算后的报表,并取到相关单元格的前景图设置
ExtCellSet ecs = (ExtCellSet) engine.calc();
INormalCell cell1 = ecs.getCell(2, (short)2);
CellGraphConfig cgc1 = cell1.getCellGraphConfig();
得到要盖章的图片:
Connection con = null;
byte[] imagebyte1 = null;
try {
con =Context.getInitCtx().getConnection(“demo”);
} catch (Exception e) {
System.out.println(“[ConnectionManager] – 获取数据库连接失败“);
e.printStackTrace();
}
ResultSet rs = null;
Statement stmt = null;
String sqlstr1=”SELECT 雇员.照片 FROM 雇员 where 雇员.雇员ID=’7′”;
//String sqlstr2=”SELECT 雇员.照片 FROM 雇员 where 雇员.雇员ID=’8′”;
System.out.println(sqlstr1);
stmt =con.createStatement();
rs=stmt.executeQuery(sqlstr1);
if (rs.next()) {
java.sql.Blob blob= (java.sql.Blob) rs.getBlob(1);
InputStream stream = blob.getBinaryStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int b; (b = stream.read()) >= 0;) {
baos.write(b);
}
imagebyte1 = baos.toByteArray();
System.out.println(“获取二进制数据库完成“);
} else {
System.out.println(“没有查询到数据“);
}
rs.close();
stmt.close();
con.close();
把得到的图片赋给单元格前景图并且将该单元格设置回报表。
if ( cgc1 != null ) {
byte[] bytes = imagebyte1;//null;
//bytes = this.getFileBytes(“001.gif”, true, ctx);
cgc1.setImageBytes(bytes);
}
ecs.setCell(2, (short) 2,cell1);
最后输出到页面:
String htmlText = ReportUtils.toHTMLString((IReport)ecs,”report1″,request); //把当前页对象输出html语法
out.println(htmlText);
展示结果如下:
这样动态改变前景图就完成了。
其中需要注意的是:
在使用api调用数据图层处理时,需要注意:修改数据的单元格中,需要已有数据图层配置,否则无法修改。
此段程序需要最新的report4支持,可以向从网上下载或者向技术支持索要。