当用jxl包操作excel文件的时候,在拷贝大批量的单元格的时候会发生错误,信息如下:
1 java.lang.ArrayIndexOutOfBoundsException: 441
2 jxl.biff.IndexMapping.getNewIndex(IndexMapping.java:68)
3 jxl.biff.FormattingRecords.rationalize(FormattingRecords.java:372)
4 jxl.write.biff.WritableWorkbookImpl.rationalize(WritableWorkbookImpl.java:727)
5 jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:489)
这个错误曾花了我不少时间,为了避免这个错误,我曾试过把一个excel报表中的纪录拆分成好几部分分别进行处理,效率可想,非常的慢,非常的烦人,后来,偶尔在网上看到有人建议看看它的源代码,也许能更好的理解它,死当活马医,下了源代码,为了能够更清楚地调试和跟踪,我把jxl中的src下的源程序直接导到了工程里进行调试,结果发现这个错误是在jxl.biff下的formatting records.java这个类中出的问题,它定义了一个变量private static final int maxFormatRecordsIndex = 0x1b9;即最大纪录格式数目为441,因此每当拷贝的单元格超过这个变量值的时候就会报错,解决的方法就是把这个0x1b9换成一个大点的值,即可,我换成了7200基本满足了需要,没有再报这个错,而且以往复制单元格,单元格格式丢失的情况也没有再出现,问题完全解决!
教训:对于现成的东西,已经做好的东西,要敢于去研究,去质疑,尤其是开源的东西,因为都是为了个人的使用,其中难免有些东西,对于我们自己的项目来说不太合适,找到它的源代码,大概一跟踪,基本上问题就能解决,以前的时候,总是感觉自己的水平菜,总认为别人的东西都是对的,结果导致问题一直拖到现在,亲自动手实践,永远是最好的方法!