wuxiren123

          關(guān)于報(bào)表自定義函數(shù)的應(yīng)用

          很多報(bào)表工具都自帶大量的函數(shù),在正常情況下足夠滿(mǎn)足用戶(hù)的報(bào)表制作需求,但是在一些特殊領(lǐng)域,可能需要一些特殊的函數(shù),在這種情況下,報(bào)表工具FineReport提供了自定義函數(shù)機(jī)制,可以由用戶(hù)根據(jù)業(yè)務(wù)需要自己來(lái)定義一些函數(shù),滿(mǎn)足用戶(hù)的自定義需求。但這些函數(shù)必須FineReport函數(shù)定義規(guī)則。以下以?xún)蓚€(gè)實(shí)際案例來(lái)仔細(xì)詳解。

          應(yīng)用一:生成UPC條形碼

          FineReport中自帶有EAN型編碼,但卻沒(méi)有UPC條形碼,但是可以通過(guò)自定義函數(shù)引用第三方包來(lái)生成UPC編碼的條形碼并顯示出來(lái)。如輸入數(shù)值12345678912,將會(huì)得到以下UPC條形碼:

          具體步驟怎么實(shí)現(xiàn)?

          1、 編寫(xiě)自定義函數(shù)

          • 導(dǎo)入第三方包

          在eclipse中導(dǎo)入第三方包barcode4j-light.jar,可在帆軟論壇上下載),barcode4j是一款開(kāi)源的條形碼生成庫(kù),能夠生成很多種編碼的條形碼,包括UPC碼。自定義函數(shù)中可以直接調(diào)用該包中現(xiàn)成的方法來(lái)生成UPC條形碼。

          • 自定義函數(shù)類(lèi)

          新建一個(gè)類(lèi)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 "參數(shù)不對(duì),必須有一個(gè)參數(shù)";
                  }

                  
          try {
                      
          // 創(chuàng)建一個(gè)UPC編碼生成器
                      UPCABean bean = new UPCABean();
                      
          // 設(shè)置條形碼高度,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, 
          false0);
                      
          // 創(chuàng)建條形碼
                      bean.generateBarcode(canvas,args[0].toString());
                      canvas.finish();
                      
          // 返回圖片顯示   
                      return canvas.getBufferedImage();
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

                  
          return args[0];
              }

          }

          2、 編譯自定義函數(shù)

          編譯Upc.java生成Upc.class文件,拷貝至報(bào)表環(huán)境目/WebReport/WEB-INF/classes/com/fr/function下;

          將第三方包barcode4j-light.jar放在報(bào)表環(huán)境目錄/WebReport/WEB-INF/lib文件夾下。

          3、 注冊(cè)自定義函數(shù)

          啟動(dòng)設(shè)計(jì)器,點(diǎn)擊服務(wù)器|函數(shù)管理器,新增函數(shù)取名為Upc,選擇Upc.class類(lèi),如下圖:

          4、 Upc()函數(shù)的使用

          重啟服務(wù)器,在報(bào)表中使用公式==Upc(num1, num2),num1為需要生成條形碼的數(shù)值,num2為生成的圖片的高度。

          如在單元格中輸入公式:=Upc(12345678912,100),預(yù)覽便可以看到條形碼了。

          應(yīng)用二:Unicode編碼轉(zhuǎn)化為中文

          數(shù)據(jù)庫(kù)中保存的是如下形式的編碼:%u5357%u4EAC-%u57CE%u5317,希望最好展示出來(lái)的是對(duì)應(yīng)的中文“南京-城北”。

          具體步驟如下:

          1、 編寫(xiě)自定義函數(shù)

          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(26);  
                          
          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、 編譯自定義函數(shù)

          將編譯后的Ubm.class放到FineReport的安裝目錄WEB-INF下面的classes目錄下,因?yàn)閁bm.java屬于包c(diǎn)om.fr.function,所以Ubm.class需要放到classes\com\fr\function目錄下。

          3、 注冊(cè)自定義函數(shù)

          生成該函數(shù)的類(lèi)后需要在設(shè)計(jì)器中進(jìn)行注冊(cè),才可以使用該函數(shù)。打開(kāi)服務(wù)器|函數(shù)管理器選擇剛剛定義好了Ubm類(lèi),如下圖

          4、 使用自定義函數(shù)

          注冊(cè)號(hào)自定義函數(shù)后,制作報(bào)表時(shí)便可直接使用了,使用方法與內(nèi)置的函數(shù)是相同的。輸入公式=Ubm("%u5357%u4EAC-%u57CE%u5317")運(yùn)行如下:

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


          posted on 2016-09-13 14:15 喝水居然長(zhǎng)肉 閱讀(193) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 梁平县| 浦东新区| 泰州市| 游戏| 防城港市| 平顶山市| 梧州市| 宣武区| 牡丹江市| 新乡县| 甘孜县| 车险| 沈阳市| 兰西县| 海宁市| 通榆县| 哈巴河县| 油尖旺区| 临夏市| 昂仁县| 文登市| 会昌县| 东港市| 晋宁县| 南安市| 呼伦贝尔市| 丰城市| 察哈| 咸丰县| 五原县| 稻城县| 洪泽县| 汝南县| 玉屏| 讷河市| 沂水县| 邵东县| 彭山县| 泾阳县| 花莲县| 正定县|