2013-08-01 121 views
0

我在java中使用JexcelAPI來操作excel文件。我需要創建一個Workbook對象的兩個副本,一個是用於進一步操作的WritableWorkbook,一個是從原始Workbook複製並保存它,以便萬一原始對象發生任何變化並且它是可寫副本,我將擁有備份。直到最近我開始收到一個ArrayIndexOutOfBOunds異常,這已經工作了很長時間。堆棧跟蹤看起來是這樣的:在JexcelAPI中的方法Workbook.createWorkbook方法拋出indexoutofbounds異常

異常線程 「main」 java.lang.IndexOutOfBoundsException:指數:62,大小:54 在java.util.ArrayList.rangeCheck(ArrayList.java:604) 是java。 util.ArrayList.get(ArrayList.java:382) at 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。(Label.java:79) at jxl.write .biff.SheetCopier.shallowCopyCell(SheetCopier.java:808) at jxl.write.biff.SheetCopi er.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) at jxl.Workbook.createWorkbook(Workbook.java:339) at 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

什麼版本的JXL?當它傳遞給createWorkbook()以創建備份時,它是否爲非空? NBSCOMBINED.xls是否在Excel中打開而沒有任何消息? –

+0

Darius X,是的,我的文件NBSCOMBINED.xls打開時沒有任何警告消息。我實際上遇到了一些麻煩,找到確切的版本(我在哪裏看?)...但是我在5個月前下載了它。在問題開始之前,我沒有更新版本。我還發現了一些我確定以前工作過的舊代碼,並在另一臺計算機上嘗試過,但它會引發同樣的警告。所以我不認爲這是我的代碼。這可能是JExcelAPI中的一個錯誤嗎?我不明白它是如何突然開始在具有不同JExcel副本的不同計算機上執行此操作。想法? – Paul

+0

你的代碼適合我,所以它必須是關於你的電子表格的東西。我假設如果您使用Excel製作簡單的單一電子表格,並將其命名爲NBSCOMBINED.xls,那麼您的代碼將運行良好。如果是這樣,也許你可以開始刪除你的電子表格的一部分,也許在某個時候,錯誤會消失。這會給你一個線索。 –

回答

0

好的,所以我找到了導致這個問題的問題。在JexcelAPI中,如果您嘗試使用重載的CreateWorkbook方法多次複製工作簿,則會出現如果您曾嘗試更改原始工作簿中的任何單元格格式時發生的錯誤。實際上,你甚至不必改變格式 - 如果你只選擇一個單元格,然後進入格式單元格窗口,單擊「常規」格式(默認情況下它已經是這種格式),然後點擊確定並保存工作簿,錯誤被拋出。但是,如果您打開窗口,然後選擇確定而不實際點擊「常規」,則不會引發錯誤。很明顯,它已經點擊了這個窗口中的一個選項,並按下了「ok」,即使它與之前的格式相同,也會觸發該錯誤。

這個錯誤最糟糕的地方在於它是永久性的......甚至考慮改變單元格的格式(打開「格式單元格」窗口並單擊左右)將徹底破壞工作簿FOREVER。如果其他人可以證實這一點,以便我知道我不瘋狂,我會很感激。儘管我很確定這是事實,因爲現在我在堆棧跟蹤的頂部看到一個「formattingrecords」錯誤。很明顯,excel存儲的信息是關於一個單元格的格式是否在過去發生了變化。但這至少讓我感到意外。

最好, 保羅

0

我有幾乎同樣的問題,我用移動代碼,以獨立的類,使新的對象每次使用該代碼的,併發出dissapeared解決它。