关于报表自定义函数的应用

简介:

很多报表工具都自带大量的函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,报表工具FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,满足用户的自定义需求。但这些函数必须FineReport函数定义规则。以下以两个实际案例来仔细详解。

应用一:生成UPC条形码

FineReport中自带有EAN型编码,但却没有UPC条形码,但是可以通过自定义函数引用第三方包来生成UPC编码的条形码并显示出来。如输入数值12345678912,将会得到以下UPC条形码:

具体步骤怎么实现?

1、 编写自定义函数

  • 导入第三方包

在eclipse中导入第三方包barcode4j-light.jar,可在帆软论坛上下载),barcode4j是一款开源的条形码生成库,能够生成很多种编码的条形码,包括UPC码。自定义函数中可以直接调用该包中现成的方法来生成UPC条形码。

  • 自定义函数类

新建一个类Upc,完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.fr. function ;
 
import java.awt.image.BufferedImage;
import org.krysalis.barcode4j.impl.upcean.UPCABean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
import com.fr.script.AbstractFunction;
 
public class Upc extends AbstractFunction {
     public Object run(Object[] args) {
         if  (args ==  null  || args.length < 1) {
             return  "参数不对,必须有一个参数" ;
         }
         try  {
             // 创建一个UPC编码生成器
             UPCABean bean =  new  UPCABean();
             // 设置条形码高度,BufferedImage.TYPE_BYTE_BINARY代表常量值12,可直接使用常量值
             final int dpi = Integer.parseInt(args[1].toString());
             bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi));
             bean.doQuietZone( false );
             BitmapCanvasProvider canvas =  new  BitmapCanvasProvider(dpi,
                     BufferedImage.TYPE_BYTE_BINARY,  false , 0);
             // 创建条形码
             bean.generateBarcode(canvas,args[0].toString());
             canvas.finish();
             // 返回图片显示   
             return  canvas.getBufferedImage();
         catch  (Exception e) {
             e.printStackTrace();
         }
         return  args[0];
     }
}

2、 编译自定义函数

编译Upc.java生成Upc.class文件,拷贝至报表环境目/WebReport/WEB-INF/classes/com/fr/function下;

将第三方包barcode4j-light.jar放在报表环境目录/WebReport/WEB-INF/lib文件夹下。

3、 注册自定义函数

启动设计器,点击服务器|函数管理器,新增函数取名为Upc,选择Upc.class类,如下图:

4、 Upc()函数的使用

重启服务器,在报表中使用公式==Upc(num1, num2),num1为需要生成条形码的数值,num2为生成的图片的高度。

如在单元格中输入公式:=Upc(12345678912,100),预览便可以看到条形码了。

应用二:Unicode编码转化为中文

数据库中保存的是如下形式的编码:%u5357%u4EAC-%u57CE%u5317,希望最好展示出来的是对应的中文“南京-城北”。

具体步骤如下:

1、 编写自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.fr. function ;  
 
import com.fr.script.AbstractFunction;  
   
public class Ubm extends AbstractFunction {  
     public Object run(Object[] args) {  
         String str = args[0].toString();  
         String st =  "" ;  
         StringBuffer buffer =  new  StringBuffer();  
         while  (str.length() > 0) {  
             if  (str.startsWith( "%u" )) {  
                 st = str.substring(2, 6);  
                 char ch = (char) Integer.parseInt(String.valueOf(st), 16);  
                 buffer.append( new  Character(ch).toString());  
                 str = str.substring(6);  
             else  {  
                 st = str.substring(0, str.indexOf( "%u" ));  
                 buffer.append(st);  
                 str = str.substring(st.length());  
             }  
         }  
         return  buffer.toString();  
     }  
}

2、 编译自定义函数

将编译后的Ubm.class放到FineReport的安装目录WEB-INF下面的classes目录下,因为Ubm.java属于包com.fr.function,所以Ubm.class需要放到classes\com\fr\function目录下。

3、 注册自定义函数

生成该函数的类后需要在设计器中进行注册,才可以使用该函数。打开服务器|函数管理器选择刚刚定义好了Ubm类,如下图

4、 使用自定义函数

注册号自定义函数后,制作报表时便可直接使用了,使用方法与内置的函数是相同的。输入公式=Ubm("%u5357%u4EAC-%u57CE%u5317")运行如下:

展示值为“南京-城北”。



本文转自 雄霸天下啦 51CTO博客,原文链接:http://blog.51cto.com/10549520/1852275,如需转载请自行联系原作者
相关文章
|
8月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之怎么使用SQL查询来获取ODPS中所有的表及字段信息
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
203 7
|
9月前
|
数据采集 SQL DataWorks
DataWorks产品使用合集之如何使用UDF(用户自定义函数)来提升数据质量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
SQL 数据可视化 Cloud Native
复杂SQL查询和可视化报表构建
场景介绍AnalyticDB MySQL数据开发流程。
复杂SQL查询和可视化报表构建
|
大数据 开发者
R 的用户自定义函数| 学习笔记
快速学习 R 的用户自定义函数
146 0
|
分布式计算 关系型数据库 数据库
PyODPS DataFrame:统一的数据查询语言
前几天,PyODPS发布了0.7版本,这篇文章给大家介绍下PyODPS新版本带来的重要特性。 之前也有若干篇文章介绍过了,我们PyODPS DataFrame是延迟执行的,在调用立即执行的方法,比如execute、persist等之前,都只是构建了表达式。
6623 0
|
存储 BI 数据处理
在报表中录入数据时如何实现行列转换
在一些生产性行业中,不同指标数据在数据库中存储是按照列方式存储,也就是每个指标一个列字段,但是在报表展现或者页面输入数据时需要将这些列转为行的方式,下面通过一个实例看下如果实现填报表的行列转换 <a href="http://c.
1059 0
|
XML BI 数据格式
将RDL报表转换成RDLC报表的函数
原文:将RDL报表转换成RDLC报表的函数 近日研究RDLC报表,发现其不能与RDL报表兼容,尤其是将RDL报表转换成RDLC报表。
949 0