我在java中使用JexcelAPI来操作excel文件。我需要制作一份工作簿对象的2份副本,一份用于进一步操作的WritableWorkbook,一份只需从原始工作簿复制然后保存,以便万一原始对象发生任何事情并且它是可写副本,我将有备份。这已经工作了很长时间,直到最近我开始得到一个ArrayIndexOutOfBOunds异常。堆栈跟踪如下所示:
线程“main”中的异常java.lang.IndexOutOfBoundsException:索引:62,大小:54 at java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util.ArrayList.get(ArrayList.java:382) 在jxl.biff.FormattingRecords.getXFRecord(FormattingRecords.java:338) 在jxl.read.biff.CellValue.getCellFormat(CellValue.java:144) 在jxl.write.biff.CellValue。(CellValue.java:129) 在jxl.write.biff.LabelRecord。(LabelRecord.java:116) 在jxl.write.Label。(Label.java:79) 在jxl.write.biff.SheetCopier.shallowCopyCell(SheetCopier.java:808) 在jxl.write.biff.SheetCopier.shallowCopyCells(SheetCopier.java:934) 在jxl.write.biff.SheetCopier.copySheet(SheetCopier.java:219) 在jxl.write.biff.WritableSheetImpl.copy(WritableSheetImpl.java:1584) 在jxl.write.biff.WritableWorkbookImpl.copyWorkbook(WritableWorkbookImpl.java:971) 在jxl.write.biff.WritableWorkbookImpl。(WritableWorkbookImpl.java:343) 在jxl.Workbook.createWorkbook(Workbook.java:339) 在jxl.Workbook.createWorkbook(Workbook.java:320) 在musicpred.musicpreddebugtest.main(musicpreddebugtest.java:17) Java结果:1
我已将问题归结为以下代码片段:
package musicpred;
import java.io.File;
import jxl.Workbook;
import jxl.write.WritableWorkbook;
import java.io.*;
import jxl.read.biff.BiffException;
import jxl.write.*;
public class musicpreddebugtest{
public static void main(String[] args) throws IOException, BiffException,
WriteException{
Workbook workbook = Workbook.getWorkbook(new File ("NBSCOMBINED.xls"));
WritableWorkbook backup = Workbook.createWorkbook(new File("BACKUP.xls"),workbook);
backup.write();
backup.close();
WritableWorkbook writableWorkbook = Workbook.createWorkbook(new
File("NBSCOMBINEDW.xls"), workbook);
}
}
我注意到我可以同时创建两个WritableWorkbooks,我甚至可以写()第二个(称为“writableWorkbook”),但出于某种原因我尝试写()第二个(“备份” “),它会抛出错误。我还应该注意到,我没有看到对于outofbound indeces有任何特别的意义:我的工作簿(行,列或表)中没有任何维度54,也没有尝试使用数组替换任何内容长度62。
有没有人知道为什么这可能会突然开始发生?我觉得它有一个令人尴尬的简单答案,但我无法弄清楚,所以任何帮助都将不胜感激!
答案 0 :(得分:0)
好的,所以我发现导致此问题的问题。在JexcelAPI中,如果您尝试使用重载的CreateWorkbook方法多次复制工作簿,则如果您曾尝试更改原始工作簿中任何单元格的格式,则会发生错误。实际上,您甚至不必更改格式 - 如果您只选择一个单元格,然后转到格式单元格窗口,单击“常规”格式(默认情况下已经是格式),然后单击确定并保存再次工作簿,错误被抛出。但是,如果您打开窗口然后选择确定而不实际单击“常规”,则不会抛出错误。显然,它已经点击了这个窗口中的一个选项并按下“ok”,即使它与之前的格式相同,也会触发错误。
关于这个错误的最糟糕的部分是它是永久的...甚至考虑改变格式(打开“格式单元格”窗口并单击)单元格将彻底破坏工作簿FOREVER。如果其他人可以证实这一点,以便我知道我不是疯了,我会很感激。虽然我很确定这种情况,因为现在我在堆栈跟踪的顶部看到了“formattingrecords”错误。显然,excel以某种方式存储了关于过去是否更改了格式的信息。但至少这对我来说是个惊喜。
最好的, 保罗
答案 1 :(得分:0)
我遇到了几乎相同的问题,我通过将代码移动到单独的类来解决它,为每次使用该代码创建新对象并发布消失。