POI操作Excel,公式计算实战 POI支持的函数 POI不支持的函数 函数注册

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章