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;
网友评论