美文网首页
POI操作Excel,公式计算实战

POI操作Excel,公式计算实战

作者: BigTaiYang大太阳 | 来源:发表于2020-04-30 23:00 被阅读0次

    POI可以说是目前Java里面操作Excel唯一的选择。好用,但也有问题,比如操作大数据量的.xlsx,那速度令人崩溃,虽然有有SXSSFSheet,效率很高,但对写入并不很有好,很多操作都无法实现。

    以上并不是本文重点:),本文主要记录本人在使用POI来操作Excel,并进行公式计算时遇到的一点问题。首先POI并不支持所有的Excel函数(如:DATEDIF),并且有些函数即便支持,但和Excel中函数的表现可能并不一致(如:FV)。

    看到这两个函数有人可能大概能猜到我要做的是个什么功能了,有一个公式超级复杂的银行投资收益试算表,我保证90%的人看了都会头疼。

    表中公式是写好的(不知道哪个大神写的),我要做的是首先填上一些基础的参数,然后根据公式计算结果,导出一个新的Excel,听起来好像不复杂,但是有些计算公式POI并不支持(我也不可能搞清楚所有公式,然后用代码算),所以就有了这篇短文。

    POI支持的函数

    FunctionEval.getSupportedFunctionNames().forEach(name->System.out.println(name));
    

    POI不支持的函数

    FunctionEval.getNotSupportedFunctionNames().forEach(name->System.out.println(name));
    

    函数注册

    FunctionEval.registerFunction("name", func);
    

    POI允许用户自己实现函数,但是只能是一个真实的函数(如DATEDIF),这也很好理解,因为我们不能随便制造一个函数,这样Excel也不认识。但,凡事就怕但是,POI不允许覆盖一个POI已经实现的函数。这就有点悲催了,因为我发现有一个函数,POI的实现并不能满足我当前的需求,又不能覆盖,这可怎么办,只能简单粗暴的复制源码来改了。

    我说的这个函数就是OFFSET,可能是为了兼容.xls,POI里面最大允许的偏移列不能超过0xFF,也就是255,但是.xlsx最大允许列是16384。这就很尴尬了,目前我只有改源码的方法,不知道看到这篇文章的大神,有没有其它更好的办法,请不吝赐教。

    Offset类:

    private static final int LAST_VALID_ROW_INDEX = 0xFFFF;
    private static final int LAST_VALID_COLUMN_INDEX = 0xFF;
    

    相关文章

      网友评论

          本文标题:POI操作Excel,公式计算实战

          本文链接:https://www.haomeiwen.com/subject/lzxxghtx.html