2016-03-20 369 views
0
try { 
     File file = new File("file4.xls"); 
     if (!file.exists()) file.createNewFile(); 
     FileInputStream fis = new FileInputStream(file); 
     POIFSFileSystem fileSystem = new POIFSFileSystem(fis); 
     // FileInputStream fis = new FileInputStream(file); 
     HSSFWorkbook workbook = new HSSFWorkbook(fileSystem); 
     //Sheet sheet = workbook.createSheet("sheet0"); 
     Sheet sheet = workbook.getSheet("sheet1"); 
     sheet.createRow(0).createCell(0).setCellValue("HelloWorld"); 
     Cell cell = sheet.createRow(1).createCell(0); 
     cell.setCellValue("Value_1_1"); 
     fis.close(); 
     FileOutputStream fos = new FileOutputStream(file); 
     workbook.write(fos); 
     workbook.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

我想創建簡單的使用java的excel文件。我收到上面提到的錯誤。NotOLE2FileException:無效的標頭簽名;讀取0x0000000000000000,預計0xE11AB1A1E011CFD0 - 文件似乎不是一個有效的OLE2文件

+2

該文件是否存在?如果沒有,你自己創建它,然後它不是一個Excel文件。 – RealSkeptic

+0

你可以試用Apache POI 3.14嗎?這改善了一些破損文件的錯誤信息 – Gagravarr

+0

我通過避免使用file.createNewFile()來解決這個問題。感謝RealSkeptic –

回答

2

你的問題是這條線的位置:

if (!file.exists()) file.createNewFile(); 

,創建一個全新的0字節的文件,這是不是一個有效的Excel文件。這就是POI反對的原因。

此外,您使用的是舊版本的Apache POI。如果您足夠愚蠢地要求他們讀取零字節文件,則較新的會給出更有幫助的例外

考慮到advice on Files vs InputStreams,但注意到您正在進行原地寫入,但尚未完全支持在打開的文件,更改您的代碼更喜歡:

Workbook workbook = null; 
File file = new File("file4.xls"); 
if (!file.exists()) { 
    if (file.toString().endsWith(".xlsx")) { 
     workbook = new XSSFWorkbook(); 
    } else { 
     workbook = new HSSFWorkbook(); 
    } 
} else { 
    workbook = WorkbookFactory.create(new FileInputStream(file)); 
} 

,將爲雙方.xls.xlsx文件的工作,並避免你的errro

雖然你真的應該升級你的Apache POI的版本太多...

相關問題