我在java中使用JexcelAPI来操作excel文件。我需要制作两个工作簿对象的副本,一个是用于进一步操作的WritableWorkbook,另一个是简单地从原始工作簿复制,然后保存它,这样在原始对象发生任何事情而它是可写副本的情况下,我将有一个备份。直到最近,我才开始得到一个ArrayIndexOutOfBOunds异常。堆栈跟踪如下所示:
线程"main“java.lang.IndexOutOfBoundsException中的异常: Index: 62,尺寸: 54在java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util.ArrayList.get(ArrayList.java:382)在jxl.biff.FormattingRecords.getXFRecord(FormattingRecords.java:338) at jxl.read.biff.CellValue.getCellFormat(CellValue.java:144) at jxl.write.biff.CellValue.(CellValue.java:129) at jxl.write.biff.LabelRecord.(LabelRecord.java:116) at jxl.write.Label.(标签)jxl.write.biff.SheetCopier.shallowCopyCell(SheetCopier.java:808) at jxl.write.biff.SheetCopier.shallowCopyCells(SheetCopier.java:934) at jxl.write.biff.SheetCopier.copySheet(SheetCopier.java:219) at jxl.write.biff.WritableSheetImpl.copy(WritableSheetImpl.java:1584) at jxl.write.biff.WritableWorkbookImpl.copyWorkbook(WritableWorkbookImpl.java:971) at jxl.write.biff.WritableWorkbookImpl.(WritableWorkbookImpl.java:343)在jxl.Workbook.createWorkbook(Workbook.java:339) at jxl.Workbook.createWorkbook(Workbook.java:320) at 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"),但是由于某种原因,当我试图编写第二个()第二个(“备份”)时,它会抛出错误。我还应该指出,我没有看到任何特别的意义,我的工作簿(行、列或工作表)中没有维度54的东西,也没有试图用长度62的数组来替换任何东西。
有没有人知道为什么会突然发生这种事?我有一种感觉,它有一个令人尴尬的简单的答案,但我无法弄清楚,所以任何帮助都会非常感谢!
发布于 2013-08-01 14:10:25
好的,所以我发现了造成这个问题的原因。在JexcelAPI中,如果您尝试多次使用重载的CreateWorkbook方法复制工作簿,则如果您过去试图更改原始工作簿中任何单元格的格式,就会发生错误。实际上,您甚至不必更改格式--如果您只选择一个单元格,然后转到“格式单元格”窗口,单击“常规”格式(默认情况下该格式已经),然后单击ok并再次保存工作簿,则会引发错误。但是,如果打开窗口,然后选择ok,而不实际单击"general",则不会引发错误。显然,它在此窗口中单击了其中一个选项,并按下"ok",即使它是与以前相同的格式,这会触发错误。
这个虫子最糟糕的地方是它是永久性的..。即使考虑更改单元格的格式(打开“格式单元格”窗口并单击周围),也会永远损坏工作簿。如果有人能证实这一点,让我知道我不是疯子,我会很感激的。虽然我非常肯定是这样的,因为现在我在堆栈跟踪的顶部看到了一个“格式化记录”错误。显然,excel以某种方式存储有关单元格在过去是否已更改其格式的信息。但这至少对我来说是个惊喜。
最好,保罗
发布于 2013-11-13 11:07:45
我有几乎相同的问题,我用移动代码来解决它,以分离类,为该代码的每一次使用创建新的对象,并对其进行消隐。
https://stackoverflow.com/questions/17984826
复制相似问题