2014-01-09 53 views
2

我想用Apache POI包編寫一個excel文件。以下是代碼片段:使用Apache POI時的空指針異常

String basePath = "/home/aman/Desktop"; 
String fileName = "result.xls"; 
File file = new File(basePath, fileName); //File not null. checked. 
OPCPackage pkg = OPCPackage.openOrCreate(file); //pkg not null. checked. 
Workbook wb = new XSSFWorkbook(pkg); //GenerateReport.java:63 

我得到以下錯誤:

Exception in thread "main" java.lang.NullPointerException 
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:382) 
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155) 
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:186) 
at amazon.category.database.GenerateReport.generateExcel(GenerateReport.java:63) 
at amazon.category.database.MerchantAdoptionStats.processAdoptionStats(MerchantAdoptionStats.java:197) 
at amazon.category.database.MerchantAdoptionStats.main(MerchantAdoptionStats.java:386) 

任何幫助表示讚賞。

+0

我想你是在誤讀堆棧跟蹤。 – Maroun

+0

@ᴍarounᴍaroun請解釋。 –

+0

@Reimeus'File.exists()'是'false',我知道文件不存在。 –

回答

0

如果看起來一切如此,您應該無法在.xls文件上創建XSSFWorkbook,因爲它是模擬.xlsx文件的類。您應該使用WorkbookFactory.create()的而不是,這是一個工廠方法將返回此時,相應的Workbook落實爲每個個案

+0

我試過'.xlsx'。同樣的結果。你能否看到關於問題的評論以獲得實際問題 –

1

我發現在教程網站這個例子: here 你可以試試這個方法。

Workbook wb = new HSSFWorkbook(); 
    //Workbook wb = new XSSFWorkbook(); 
    CreationHelper createHelper = wb.getCreationHelper(); 
    Sheet sheet = wb.createSheet("new sheet"); 

    // Create a row and put some cells in it. Rows are 0 based. 
    Row row = sheet.createRow((short)0); 
    // Create a cell and put a value in it. 
    Cell cell = row.createCell(0); 
    cell.setCellValue(1); 

    // Or do it on one line. 
    row.createCell(1).setCellValue(1.2); 
    row.createCell(2).setCellValue(createHelper.createRichTextString("This is a string")); 
    row.createCell(3).setCellValue(true); 

    // Write the output to a file 
    FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
    wb.write(fileOut); 
    fileOut.close(); 
+0

我閱讀了相同的教程。在文件流部分是我在做什麼。這裏:http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream –

+0

也看看這個答案:http://stackoverflow.com/questions/11154678/xssfworkbook-takes-a-lot-加載的時間 –

1

我一頭撞到了自己的頭上。訣竅是文件是否先前存在。

//if file is .xls 
Workbook workbook; 
if(file.exists) { 
    NPOIFSFileSystem fs = new NPOIFSFileSystem(file); 
    workbook = new HSSFWorkbook(fs.getRoot(), false); 
} 
else { 
    workbook = new HSSFWorkbook(); 
} 

//if file is .xlsx 
Workbook workbook; 
if(file.exists) { 
    OPCPackage pkg = OPCPackage.open(file); 
    workbook = new XSSFWorkbook(pkg); 
} 
else { 
    workbook = new XSSFWorkbook(); 
} 

訣竅似乎是(這看起來並不像它是記錄良好),您創建的工作簿關閉文件系統或包對象只有之前該文件存在。如果你想要一個新文件,那麼不要使用文件系統或包對象來創建你的工作簿。

+0

我認爲[HSSFWorkbook constructor java docs](https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html)在'new HSSFWorkbook()「用於創建,」新HSSFWorkbook(NPOIFSFileSystem)「(+朋友)用於讀取現有文件?或者有什麼不清楚的地方? – Gagravarr

+0

還不清楚。說實話,我在Apache POI的網站上搜索了Javadoc鏈接,並找不到它。它不應該只在Javadoc中。它也應該在「如何」部分。因此,直到我明白了這一點之前,我經歷了兩天的挫折。 –

+0

附近的快速指南的頂部[如何創建一個新的工作簿](http://poi.apache.org/spreadsheet/quick-guide.html#NewWorkbook)它顯示你的情況,這是不是掩蓋你在文檔? – Gagravarr