不少報表工具都自帶大量的函數,在正常狀況下足夠知足用戶的報表製做需求,可是在一些特殊領域,可能須要一些特殊的函數,在這種狀況下,報表工具FineReport提供了自定義函數機制,能夠由用戶根據業務須要本身來定義一些函數,知足用戶的自定義需求。但這些函數必須FineReport函數定義規則。如下以兩個實際案例來仔細詳解。java
應用一:生成UPC條形碼數據庫
FineReport中自帶有EAN型編碼,但卻沒有UPC條形碼,可是能夠經過自定義函數引用第三方包來生成UPC編碼的條形碼並顯示出來。如輸入數值12345678912,將會獲得如下UPC條形碼:canvas
具體步驟怎麼實現?服務器
一、 編寫自定義函數app
導入第三方包eclipse
在eclipse中導入第三方包(barcode4j-light.jar,可在帆軟論壇上下載),barcode4j是一款開源的條形碼生成庫,可以生成不少種編碼的條形碼,包括UPC碼。自定義函數中能夠直接調用該包中現成的方法來生成UPC條形碼。ide
自定義函數類函數
新建一個類Upc,完整代碼以下:工具
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]; } }
二、 編譯自定義函數ui
編譯Upc.java生成Upc.class文件,拷貝至報表環境目/WebReport/WEB-INF/classes/com/fr/function下;
將第三方包barcode4j-light.jar放在報表環境目錄/WebReport/WEB-INF/lib文件夾下。
三、 註冊自定義函數
啓動設計器,點擊服務器|函數管理器,新增函數取名爲Upc,選擇Upc.class類,以下圖:
四、 Upc()函數的使用
重啓服務器,在報表中使用公式==Upc(num1, num2),num1爲須要生成條形碼的數值,num2爲生成的圖片的高度。
如在單元格中輸入公式:=Upc(12345678912,100),預覽即可以看到條形碼了。
應用二:Unicode編碼轉化爲中文
數據庫中保存的是以下形式的編碼:%u5357%u4EAC-%u57CE%u5317,但願最好展現出來的是對應的中文「南京-城北」。
具體步驟以下:
一、 編寫自定義函數
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(); } }
二、 編譯自定義函數
將編譯後的Ubm.class放到FineReport的安裝目錄WEB-INF下面的classes目錄下,由於Ubm.java屬於包com.fr.function,因此Ubm.class須要放到classes\com\fr\function目錄下。
三、 註冊自定義函數
生成該函數的類後須要在設計器中進行註冊,纔可使用該函數。打開服務器|函數管理器選擇剛剛定義好了Ubm類,以下圖
四、 使用自定義函數
註冊號自定義函數後,製做報表時即可直接使用了,使用方法與內置的函數是相同的。輸入公式=Ubm("%u5357%u4EAC-%u57CE%u5317")運行以下:
展現值爲「南京-城北」。