java.lang.NullPointerException при добавлении информации в существующий файл Excel

Я пытаюсь добавить информацию в существующий файл Excel, но получаю исключение java.lang.NullPointerException. См. приведенный ниже код и сообщение об исключении.

Код:

private WritableSheet appendingSheet;
private static File report;

public void AppendToDoc (String path) throws IOException, WriteException, BiffException {

    this.inputFile = path;
    report = new File(inputFile);

    Workbook appendingWorkbook = Workbook.getWorkbook(new File(inputFile));
    WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"),appendingWorkbook);
    appendingSheet = copy.getSheet("Sheet 1");      
}

public void WriteToDoc (int option, String testName, String execDate, String time, boolean status) throws RowsExceededException, WriteException, IOException, BiffException{        


    int startingRow = NumOfRows(this.inputFile) + 1; //I have a function which finds the number of existing rows in the existing document. It works. 
    Label label = new Label(1, startingRow, "hello", times);    
    appendingSheet.addCell(label);

}

Код вызова:

AppendToDoc("C:/Users/smith/ExcelTestFile.xls");
WriteToDoc(2, "This is a test", "executed", timeStamp, true);

Сообщение об исключении:

Исключение в потоке «основной» java.lang.NullPointerException в jxl.write.biff.Styles.getFormat(Styles.java:214) в jxl.write.biff.CellValue.addCellFormat(CellValue.java:468) в jxl.write. biff.CellValue.setCellDetails(CellValue.java:282) в jxl.write.biff.LabelRecord.setCellDetails(LabelRecord.java:216) в jxl.write.biff.WritableSheetImpl.addCell(WritableSheetImpl.java:1199) в ExcelOperations.WriteToDoc (ExcelOperations.java:149) в ChequeImage.main(ChequeImage.java:174)

ПРИМЕЧАНИЕ. Похоже, что исключение происходит в строке "appendingSheet.addCell(label);".

Спасибо за помощь.

EDIT 1: На изображении ниже показано содержимое appendingSheet непосредственно перед выполнением «appendingSheet.addCell(label)». Я не совсем уверен, что он представляет, но он определенно не кажется нулевым. введите здесь описание изображения


person Hypaa    schedule 31.07.2013    source источник
comment
Экземпляр appendingSheet инициализируется методом AppendToDoc и ограничивается только этим методом. Причина NPE для WriteToDoc, поскольку appendingSheet есть null.   -  person Smit    schedule 01.08.2013
comment
Было бы полезно также показать код, вызывающий эти методы.   -  person Jonathan Drapeau    schedule 01.08.2013
comment
@Smit appendingSheet — это глобальная переменная. Несмотря на то, что оно инициализировано в AppendToDoc, значение все равно будет присутствовать даже после завершения AppendToDoc no?   -  person Hypaa    schedule 01.08.2013
comment
@Jonathan Drapeau Я сразу же отредактирую свой вопрос с методами вызова.   -  person Hypaa    schedule 01.08.2013
comment
appendingSheet = copy.getSheet("Sheet 1"); Разве getSheet не возвращает значение null?   -  person Jean Waghetti    schedule 01.08.2013
comment
@Hypaa Вы пытались его отладить? Я обеспокоен тем, что ваш appendingSheet не static   -  person Smit    schedule 01.08.2013
comment
@Smit Я только что отладил и проверил содержимое appendingSheet прямо перед выполнением appendingSheet.addCell(label). Это НЕ нулевое значение. Я постараюсь предоставить снимок экрана, когда я наведу указатель мыши на appendingSheet.   -  person Hypaa    schedule 01.08.2013
comment
@Джин Вагетти тоже.   -  person Hypaa    schedule 01.08.2013
comment
Очевидно, вам нужно 10 очков репутации, чтобы публиковать изображения... вам просто нужно поверить мне на слово, что appendingSheet не равен нулю.   -  person Hypaa    schedule 01.08.2013
comment
@Hypaa Может быть что-то, что вызывает NPE, вы уверены, что добавили правильную трассировку стека?   -  person Smit    schedule 01.08.2013
comment
@Smit Я предоставил больше информации в Edit 1. Спасибо.   -  person Hypaa    schedule 01.08.2013
comment
Для удобства в трассировке стека указана строка с ошибкой. Не могли бы вы сообщить нам, какая строка имеет значение 149 в файле с именем ExcelOperations.java?   -  person Omar    schedule 01.08.2013
comment
@Hypaa Можете ли вы создать SSCCE? и, как сказал @ Омар, пожалуйста, укажите нам на эти строки. Попробуйте предоставить недавнюю полную трассировку стека и некоторый связанный код с этими строками исключений.   -  person Smit    schedule 01.08.2013


Ответы (3)


Не могу сказать, что знаком с Biff, но POI, кажется, работает похожим образом. Похоже, вы создали книгу:

Копия WritableWorkbook = Workbook.createWorkbook(новый файл("output.xls"),appendingWorkbook);

Но тогда вы не создаете лист, на который ссылаетесь:

appendingSheet = copy.getSheet("Лист 1");

Я предполагаю, что вы получаете NPE, потому что "copy.getSheet("Лист 1");" возвращает ноль. В отличие от случая, когда вы просто открываете книгу в Excel, API, скорее всего, не создаст для вас этот лист по умолчанию. Бьюсь об заклад, вам придется создать объект листа, прежде чем вы сможете добавлять ячейки.

person kondrak    schedule 01.08.2013
comment
Пожалуйста, смотрите мое редактирование 1. Спасибо. - person Hypaa; 01.08.2013
comment
Вы уверены, что это не то, как нулевые или неправильно отформатированные данные представлены в приложении? Возможно, попробуйте System.out.println() после appendingSheet = copy.getSheet(Sheet 1); чтобы увидеть, является ли возвращаемый лист нулевым или иным образом неверным. - person kondrak; 01.08.2013

Итак... Мне удалось решить проблему.

Я не могу объяснить, почему, но после того, как я переопределил "copy" и "appendingWorkbook" (не appendingSheet) как глобальные переменные вместо локальных в AppendToDoc() ; а также добавил строчку copy.write(), программа заработала...

Спасибо всем за помощь. Я очень ценю это.

person Hypaa    schedule 01.08.2013

Я столкнулся со следующим исключением при записи данных в файл XLS с использованием JXL API.

Exception in thread "main" java.lang.NullPointerException
    at jxl.write.biff.Styles.getFormat(Styles.java:214)
    at jxl.write.biff.CellValue.addCellFormat(CellValue.java:468)
    at jxl.write.biff.CellValue.setCellDetails(CellValue.java:282)
    at jxl.write.biff.LabelRecord.setCellDetails(LabelRecord.java:216)
    at jxl.write.biff.WritableSheetImpl.addCell(WritableSheetImpl.java:1199)
    at com.java.report.XLS_JXLReport.main(XLS_JXLReport.java:31)

Я заметил, что следующая ошибка возникает из-за того, что WritableFont пуст. Исходный код, из которого возникает исключение:

Styles.java:214
    // Do the same with the statically shared fonts
    if (format.getFont() == WritableWorkbook.ARIAL_10_PT) // Line 214
    {
      format.setFont(getArial10Pt());
    }

Чтобы избежать этой ошибки, обязательно укажите Имя шрифта.

Пример кода с использованием Java Excel API » 2.6.12

public class XLS_JXLReport {
    static String filePath = "C:/Yash/";
    public static void main(String[] args) throws IOException, JXLException {
        //Creates a writable workbook with the given file name
        jxl.write.WritableWorkbook workbook = jxl.Workbook.createWorkbook(new File(filePath+"CopyCell.xls"));
        WritableSheet sheet = workbook.createSheet("My Sheet", 0);
        
        // Create cell font and format
        WritableFont cellFont = new jxl.write.WritableFont(WritableFont.TIMES, 16);
            cellFont.setColour(jxl.format.Colour.BLUE);
        WritableCellFormat cellFormat = new WritableCellFormat(cellFont);
            cellFormat.setBackground(jxl.format.Colour.GRAY_25);
        
        //cellFormat = null; // To get the NullPointerException at Styles.java:214. Uncomment this line of code.
        
        // Create the label, specifying content and format
        Label label = new Label(1, 2, "ABCD", cellFormat);
        sheet.addCell(label);
        
        //Create copies of cell in a loop
        WritableCell copiedCell = null;
        for (int i = 0 ; i < 4 ; i ++) {
            copiedCell = label.copyTo(1, 4 + i); //Deep copy cell
            sheet.addCell(copiedCell);
        }
        
        closeWorkbook(workbook);
    }
    public static void closeWorkbook(WritableWorkbook workbook) throws IOException, JXLException {
        if (workbook == null)
            return;
        if (workbook.getNumberOfSheets() == 0) {
            workbook.createSheet("No data", 0); // otherwise pointer error
        }
        //Writes out the data held in this workbook in Excel format
        workbook.write(); 
        //Close and free allocated memory 
        workbook.close(); 
    }
}

JXL APIwiki позволяет пользователям читать, создавать и изменять листы в книге Excel(.xls) во время выполнения. Он не поддерживает формат .xlsx.

  • JXL API поддерживает документы Excel версий Excel 95, 97, 2000, XP, and 2003. Эти документы имеют расширение .xls
  • Для .xlsx используйте POI Apache.
person Yash    schedule 04.11.2020