Проблемы с копированием листов Excel с API JExcel
Я работал над некоторыми довольно сложными файлами Excel и столкнулся с проблемой при копировании листов. Всякий раз, когда я пытаюсь скопировать лист, который не является полностью пустым, я получаю следующее сообщение:
Exception in thread "main" java.lang.NullPointerException
at jxl.write.biff.WritableSheetCopier.shallowCopyCells(WritableSheetCopier.java:499)
at jxl.write.biff.WritableSheetCopier.copySheet(WritableSheetCopier.java:239)
at jxl.write.biff.WritableSheetImpl.copy(WritableSheetImpl.java:1622)
at jxl.write.biff.WritableWorkbookImpl.copySheet(WritableWorkbookImpl.java:987)
at excelCalc.main(excelCalc.java:18)
Мне интересно, в чем здесь проблема. Зачем вообще нужна функция ".copySheet("), если ее нельзя использовать для листов с информацией в них. В попытке воспроизвести проблему в более простом масштабе я создал код, который вы видите ниже. Выходные данные, которые я ожидаю получить см. 2 идентичных листа с ячейкой (0,0), имеющей метку "тест". Один лист называется "Потоки", другой - "копия". Есть идеи, почему это дает этот нулевой указатель?
import java.io.File;
import jxl.*;
import jxl.write.*;
public class excelCalc
{
public static void main(String[] args) throws Exception
{
WritableWorkbook outputBook = Workbook.createWorkbook(new File("C:/Users/Kevin Brey/CS243/ExcelTest/files/output", "output.xls"));
WritableSheet rSheet = outputBook.createSheet("Flows", 0);
rSheet.addCell(new Label(0, 0, "test"));
outputBook.copySheet(0, "copy", 0);
outputBook.write();
outputBook.close();
}
}
РЕДАКТИРОВАТЬ: этот код также дает то же исключение:
import java.io.File;
import jxl.*;
import jxl.write.*;
public class excelCalc
{
public static void main(String[] args) throws Exception
{
WritableWorkbook outputBook = Workbook.createWorkbook(new File("C:/Users/Kevin Brey/CS243/ExcelTest/files/output", "output.xls"));
WritableSheet sheet1 = outputBook.createSheet("Sheet1", 0);
WritableSheet sheet2 = outputBook.createSheet("Sheet2", 1);
sheet1.addCell(new Label(0, 0, "Label1"));
sheet2.addCell(new Label(0, 0, "Label2"));
outputBook.copySheet(0, "Copy", 1);
outputBook.write();
outputBook.close();
}
}
Одна из моих идей о том, что может быть не так, заключается в том, что, поскольку лист открыт и отредактирован, его нельзя скопировать. Я действительно не знаю, как обойти это все же.
2 ответа
Это ошибка в jxl-2.6.12.jar, используйте вместо нее jxl-2.6.10.jar.
Подробности:
опечатка '&&' в '&'
строка 493 - строка 504 в WritableSheetCopier.java
if (c != null)
{
toSheet.addCell(c);
// Cell.setCellFeatures short circuits when the cell is copied,
// so make sure the copy logic handles the validated cells
if (c.getCellFeatures() != null &
c.getCellFeatures().hasDataValidation())
{
validatedCells.add(c);
}
}
строка 540 - строка 551 в WritableSheetCopier.java
if (c != null)
{
toSheet.addCell(c);
// Cell.setCellFeatures short circuits when the cell is copied,
// so make sure the copy logic handles the validated cells
if (c.getCellFeatures() != null &
c.getCellFeatures().hasDataValidation())
{
validatedCells.add(c);
}
}
строка 990 - строка 1001 в SheetCopier.java
if (c != null)
{
toSheet.addCell(c);
// Cell.setCellFeatures short circuits when the cell is copied,
// so make sure the copy logic handles the validated cells
if (c.getCellFeatures() != null &
c.getCellFeatures().hasDataValidation())
{
validatedCells.add(c);
}
}
Лист для копирования пуст, перед копированием добавьте несколько ячеек на лист для копирования