动态改变报表前景图

之前有同事介绍过前景图,背景图的使用方式,也介绍过如何通过报表实现盖章的动作,本篇文章主要介绍的不是如何去实现盖章,而是根据业务需求,通过选择图片来实现具体要盖哪个章的问题,动态控制盖得是哪个章。当然前景图和背景图是类似的,前景图能够实现的动态控制,背景图也能实现。

本文举例为,一个已经设置好前景图的报表,根据需要,改变其中一个单元格前景图的内容。

实现动态的盖章。

实现步骤,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支持,可以向从网上下载或者向技术支持索要。