使用由NullPointerException引起的Apache POI-POIXMLException将工作表附加到Excel文件

这是我的代码:

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xssf.usermodel.*; public class testingsyncclass { public static void main(String[] args) throws IOException, InvalidFormatException{ writeParametersTableToFile("C:/ENTERPRISE_TESTING", "XLSX_TEST", "SHEETNAME"); } public static void writeParametersTableToFile(String fileLocation, String fileName, String tableLocator) throws InvalidFormatException{ String[] columnHeaders = {"What", "is", "a", "computer", "?"}; ArrayList<Object[]> xlsxFileData = new ArrayList<Object[]>(); for(int i = 0; i < 10; i++){ Object[] o = {"CoffeeCup", "AnglerJS", "Emerald", "C♭", "C--"}; xlsxFileData.add(o); } try{ if(fileName.contains(".xlsx")){ fileName = fileName.replaceAll(".xlsx", ""); } File file = new File(fileLocation); if(file.mkdirs() || file.exists()){ File excelFile = new File(fileLocation + "/" + fileName + ".xlsx"); XSSFWorkbook workbook; XSSFSheet sheet; if(excelFile.exists()){ workbook = new XSSFWorkbook(excelFile); } else { workbook = new XSSFWorkbook(); } if(workbook.getSheet(tableLocator)==null){ sheet = workbook.createSheet(tableLocator); } else { sheet = workbook.createSheet("NEW_TEST_SHEET"); } XSSFRow firstRow = sheet.createRow(0); //write headers for(int i = 0; i < columnHeaders.length; i++){ XSSFCell cell = firstRow.createCell(i); cell.setCellValue(columnHeaders[i]); } //write data for(int i = 0; i < xlsxFileData.size(); i++){ XSSFRow row = sheet.createRow(i+1); for(int j = 0; j < xlsxFileData.get(i).length; j++){ XSSFCell cell = row.createCell(j); String value = (String) xlsxFileData.get(i)[j]; cell.setCellValue(value); } } FileOutputStream fileOut = new FileOutputStream(fileLocation + "/" + fileName + ".xlsx"); //write this workbook to an Outputstream. System.out.println(fileOut + " (fileout)"); System.out.println(workbook + " (workbook)"); workbook.write(fileOut); fileOut.flush(); fileOut.close(); workbook.close(); } else { System.err.println(fileLocation + " was an invalid directory."); } } catch (IOException e){ System.err.println("Something went wrong!"); e.printStackTrace(); } } } 

创build文件工作正常 – 文件按预期创build。 但是,如果文件存在,我希望此方法创build工作表并将其添加到工作簿。 有了我现在的代码,我得到以下exception:

 Exception in thread "main" org.apache.poi.POIXMLException: java.lang.NullPointerException at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:168) at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:246) at testframework.testingsyncclass.writeParametersTableToFile(testingsyncclass.java:67) at testframework.testingsyncclass.main(testingsyncclass.java:17) Caused by: java.lang.NullPointerException 

workbook.write(fileOut)此exception的行是workbook.write(fileOut)但工作簿和fileOut都不为空。 输出文件在第二次运行时也会损坏。

我究竟做错了什么?

此错误是由于创build工作簿时没有将FileInputStream作为parameter passing引起的。 尽pipeAPIbuild议您可以将File / Path作为parameter passing,但是文件基本上是以ReadOnly模式打开的 – 所以在再次写入时会引发exception。

这通过传递FileInputStream来解决。 我的代码然后变成:

 FileInputStream fis = new FileInputStream(excelFile); workbook = new XSSFWorkbook(fis);