Apache Poi可以評估並返回公式中函數的結果。但是對於特殊函數HYPERLINK(),它只返回「顯示值」,而不是實際計算的超鏈接值。如何讀取POI中的HYPERLINK()函數的結果
我有一個Excel文件,其中包含複雜的計算超鏈接,它將來自工作簿中多個不同字段的結果組合起來,因此,能夠讀取超鏈接的結果URL會很好,但默認formula evaluation我只獲取「顯示值」,而不是實際的URL。
有沒有一種方法可以用某種方式計算公式,以便我可以讀取實際的URL?
Apache Poi可以評估並返回公式中函數的結果。但是對於特殊函數HYPERLINK(),它只返回「顯示值」,而不是實際計算的超鏈接值。如何讀取POI中的HYPERLINK()函數的結果
我有一個Excel文件,其中包含複雜的計算超鏈接,它將來自工作簿中多個不同字段的結果組合起來,因此,能夠讀取超鏈接的結果URL會很好,但默認formula evaluation我只獲取「顯示值」,而不是實際的URL。
有沒有一種方法可以用某種方式計算公式,以便我可以讀取實際的URL?
找到了一種方法,但我可能會稱之爲「醜陋的解決辦法」:
如果試圖重新實現了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。
有人知道這樣做的更「官方」嗎?