润乾报表单元格显示二维码

需求描述

需要能在单元格内通过传入的字符串转化成二维码显示在单元格内。

通过自定义函数实现上述需求。

 

实现方法

1. 接受字符串,生成BufferedImage对象

2. 通过润乾报表提供的ImageUtils.writePNG(bi),返回byte[]给单元格

3. 单元格类型设置为图片字段

实现代码

1. 设计报表

2. 实现代码

1) 接受字符串为参数,生成BufferedImage对象

public BufferedImage CreateQrcode(String testString){

Qrcode qrcode=new Qrcode();

BufferedImage bi = new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);

Graphics2D g = bi.createGraphics();

try{

qrcode.setQrcodeErrorCorrect(‘M’);

qrcode.setQrcodeEncodeMode(‘B’);

qrcode.setQrcodeVersion(7);

byte[] d =testString.getBytes(“GBK”);

g.setBackground(Color.WHITE);

g.clearRect(0, 0, 139, 139);

g.setColor(Color.BLACK);

if (d.length>0 && d.length <123){

boolean[][] b = qrcode.calQrcode(d);

for (int i=0;i<b.length;i++){

for (int j=0;j<b.length;j++){

if (b[j][i]) {

g.fillRect(j*3+2,i*3+2,3,3);

}

}

 

}

 

}

}catch(Exception e){

e.printStackTrace();

}finally{

g.dispose();

bi.flush();

}

return bi;

}

2) 通过润乾报表提供的ImageUtils.writePNG(bi),返回byte[]给单元格

public Object calculate(Context arg0, boolean arg1) {

//报表中调用该函数传递过来的参数列表

byte[] want=null;

if ( this.paramList.size() == 0 ) {

throw new ReportError( “二维码自定义函数参数列表为空” );

}

//取得计算表达式(得到传递给报表的参数)

Expression param1 = ( Expression )this.paramList.get( 0 );

if ( param1 == null ) {

throw new ReportError( “二维码自定义函数出现无效参数” );

}

//运算表达式,并取得运算结果(Object)

Object result1 = Variant2.getValue( param1.calculate(arg0,arg1),false,arg1 );

if( result1==null ) return null;

if(result1 instanceof String){

String str=result1.toString();

System.out.println(str);

BufferedImage bi=CreateQrcode(str);

try {

want=ImageUtils.writePNG(bi);

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return want ;

 

}

热门文章