2013-08-01 3 views
0

Я использую JexcelAPI в java для управления файлами excel. Мне нужно сделать 2 экземпляра объекта Workbook, один для WritableWorkbook для дальнейших манипуляций, а один просто скопировать из оригинальной книги и затем сохранить его, так что, если что-то случится с исходным объектом и его копией, доступной для записи, у меня будет резервное копирование. Это работает долгое время, пока я не начал получать исключение ArrayIndexOutOfBOunds. Трассировка стека выглядит следующим образом:Метод Workbook.createWorkbook метод в JexcelAPI throwing indexoutofbounds exception

Исключение в потоке "основного" 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. напишите.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) at jxl.write.biff.SheetCopi er.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»), но по какой-то причине, когда я пытаюсь написать() вторую («backup»), он выдает ошибку. Я также должен отметить, что я не вижу никакого особого значения для наружных индексов: у меня нет ничего с размером 54 в моей книге (строках, столбцах или листах), и я не пытаюсь заменить что-либо массивом длина 62.

Есть ли какие-либо идеи, почему это может внезапно начаться? У меня такое чувство, что у меня есть смущающий легкий ответ, но я не могу понять это, поэтому любая помощь будет принята с благодарностью!

+0

Какая версия JXL? Является ли книга не нулевой, когда она передается createWorkbook() для создания резервной копии? Открывает ли NBSCOMBINED.xls в Excel без каких-либо сообщений? –

+0

Darius X, да, мой файл NBSCOMBINED.xls открывается без предупреждений. У меня действительно есть проблемы с поиском точной версии (где я смотрю?) ... но я скачал ее около 5 месяцев назад. И я не обновлял версию до начала проблемы. Я также нашел более старый код, который, как я уверен, работал раньше, и попробовал его на другом компьютере, но он выдает такое же предупреждение. Поэтому я не думаю, что это мой код. Может ли это быть ошибкой в ​​JExcelAPI? Я не вижу, как это внезапно начнет делать это на разных компьютерах с разными копиями JExcel. мысли? – Paul

+0

Ваш код отлично подходит для меня, так что это должно быть что-то о вашей электронной таблице. Я предполагаю, что если вы создадите простую единую таблицу с помощью Excel и назовете ее NBSCOMBINED.xls, тогда ваш код будет работать нормально. если да, возможно, вы можете начать удалять части своей таблицы, и, возможно, в какой-то момент ошибка исчезнет. Это даст вам ключ. –

ответ

0

Хорошо, поэтому я обнаружил проблему, которая вызывала эту проблему. В JexcelAPI, если вы пытаетесь копировать книгу несколько раз с использованием перегруженного метода CreateWorkbook, возникает ошибка, если вы когда-либо пытались изменить формат любой ячейки в исходной книге в прошлом. На самом деле вам даже не нужно менять формат - если вы выберете только одну ячейку, а затем перейдите в окно ячеек формата, щелкните «общий» формат (который уже был по умолчанию) и нажмите «ОК» и сохраните рабочая книга снова, ошибка забрасывается. Но если вы откроете окно и затем выберите ОК, не нажимая на «general», ошибка не будет выбрана. Очевидно, что он нажал одну из опций в этом окне и нажал «ok», даже если это был тот же формат, что и раньше, что вызывает ошибку.

Худшая часть этой ошибки заключается в том, что она постоянна ... даже думая об изменении формата (открыв окно «ячейки формата» и щелкнув по нему), ячейка полностью повредит рабочую книгу FOREVER. Если кто-то другой может подтвердить это, чтобы я знал, что я не сумасшедший, я был бы признателен.хотя я очень уверен, что это так, потому что теперь я вижу ошибку «formattingrecords» в верхней части трассировки стека. Очевидно, каким-то образом Excel хранит информацию о том, изменилась ли в прошлом ячейка своего формата. Но это как-то неожиданно для меня.

лучше, Пол

0

У меня была почти такая же проблема, и я решил его с движущимися код для того чтобы отделить класс, сделать новый объект для каждого использования этого кода и выдает исчезли.