如何在POI中读取HYPERLINK()函数的结果

时间:2013-04-02 06:06:08

标签: apache-poi excel-formula

Apache Poi可以评估并返回公式中函数的结果。但是对于特殊功能HYPERLINK(),它只返回“显示值”,而不是实际计算的超链接值。

我有一个Excel文件,其中包含复杂的计算超链接,这些超链接组合了工作簿中许多不同字段的结果,因此能够读取超链接的结果URL会很好,但默认情况下{{3}我只得到“显示值”,而不是实际的URL。

我是否有办法以某种方式计算公式,以便我可以阅读实际的网址?

1 个答案:

答案 0 :(得分:2)

找到了一种方法,但我可能会称之为“丑陋的解决方法”:

如果您尝试使用WorkbookEvaluator.registerFunction(“HYPERLINK”,func)在Apache Poi中重新实现“超链接”功能实现,则会出现无法覆盖内置函数的错误。

在深入挖掘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值而不是display-value:

    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。

有人知道更“官方”的做法吗?