2013-04-02 33 views
2

Apache Poi可以評估並返回公式中函數的結果。但是對於特殊函數HYPERLINK(),它只返回「顯示值」,而不是實際計算的超鏈接值。如何讀取POI中的HYPERLINK()函數的結果

我有一個Excel文件,其中包含複雜的計算超鏈接,它將來自工作簿中多個不同字段的結果組合起來,因此,能夠讀取超鏈接的結果URL會很好,但默認formula evaluation我只獲取「顯示值」,而不是實際的URL。

有沒有一種方法可以用某種方式計算公式,以便我可以讀取實際的URL?

回答

2

找到了一種方法,但我可能會稱之爲「醜陋的解決辦法」:

如果試圖重新實現了Apache POI「超級鏈接」功能的實現與WorkbookEvaluator.registerFunction(「超鏈接」,FUNC)您會收到內置函數無法覆蓋的錯誤。

挖掘到POI多一點之後,我發現我可以通過將一類爲「org.apache.poi.ss.formula.eval」包訪問的內建函數列表:

package org.apache.poi.ss.formula.eval; 

public class BuiltinFunctionsOverloader { 
    public static void replaceBuiltinFunction(int index, Function function) { 
     FunctionEval.functions[index] = function; 
    } 
} 

然後我可以使用這個重寫一個函數,例如超鏈接具有指數359:

BuiltinFunctionsOverloader.replaceBuiltinFunction(359, func); 

與函數執行如下命令,我現在明白了URL的值,而不是顯示值:

Function func = new Function2Arg() { 
     @Override 
     public final ValueEval evaluate(ValueEval[] largs, int srcRowIndex, int srcColumnIndex) { 
      switch (largs.length) { 
       case 1: 
        return evaluate(srcRowIndex, srcColumnIndex, largs[0]); 
       case 2: 
        return evaluate(srcRowIndex, srcColumnIndex, largs[0], largs[1]); 
      } 
      return ErrorEval.VALUE_INVALID; 
     } 

     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) { 
      return arg0; 
     } 

     @Override 
     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) { 
      return arg0; 
     } 
    }; 

醜陋,但至少不需要我補丁POI。

有人知道這樣做的更「官方」嗎?