NotOLE2FileException:标头签名无效; 读取0x0000000000000000,预计0xE11AB1A1E011CFD0

我想要做的是询问用户是否要创build一个新的或select一个现有的Excel工作簿。 select一个现有的文件是没有问题的。 但是,当我为新的Excel文件创build一个名称时,我收到一个错误,指出“您的文件似乎不是有效的OLE2文档”。

public void selectExcelFile() { String excelFileName = null; // the name/directory/address of the excel file created/selected FileInputStream excelFileIn = null; // allows us to connect to the Excel file so we can read it FileOutputStream excelFileOut = null; // allows us to connect to the Excel file so we can write to it ExcelFileUtility eUtil = new ExcelFileUtility(); // used open an excel file if(columnsQuery != null) { try { excelFileName = eUtil.getFile(FileExtensions.XLS); // file extension = ".xls" if(excelFileName != null) { excelFileIn = new FileInputStream(new File(excelFileName)); workbook = new HSSFWorkbook(excelFileIn); exportColsToWorkbook(columnsQuery); excelFileOut = new FileOutputStream(excelFileName); workbook.write(excelFileOut); // close everything workbook.close(); excelFileIn.close(); excelFileOut.close(); } } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } 

接着:

 public String getFile(String extension) { String result = null; if(extension != null) { int choice = askIfNewFile(); if(choice == 0) { // yes, create new file result = createFile(extension); } else { // no, select existing file result = getFileLocation(); } } else { System.out.println("No file extension."); } return result; } public String createFile(String extension) throws IOException { String newFileName = ""; File newFile = null; boolean isCreated = false; JFrame frame = new JFrame("Creating a New ." + extension + " File"); String result = null; String dir = getFileDirectory(); System.out.println("DIR: " + dir); if(dir != null) { while(newFileName.isEmpty() || newFileName == null) { // Used WorkbookUtil.createSafeSheetName to validate file name // Please replace if there is a better option newFileName = WorkbookUtil.createSafeSheetName(JOptionPane.showInputDialog(frame, "Enter new ." + extension + " file name:")); } newFile = new File(dir + "\\" + newFileName + "." + extension); System.out.println(newFile.toString()); try { isCreated = newFile.createNewFile(); if(isCreated) { result = newFile.getAbsolutePath(); } else { System.out.println("File already exists."); } } catch(IOException ioe) { System.out.println(ioe); } } return result; } public String getFileLocation() { String result = null; JFileChooser pickFile = new JFileChooser(); if (pickFile.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { try { result = pickFile.getSelectedFile().getCanonicalPath(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // check if file exists } System.out.println("File location: " + result); return result; } public String getFileDirectory() { String result = null; JFileChooser pickFile = new JFileChooser(); pickFile.setDialogTitle("Choose Folder"); pickFile.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); pickFile.setAcceptAllFileFilterUsed(false); if (pickFile.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { result = pickFile.getSelectedFile().toString(); } else { System.out.println("No Selection "); } return result; } 

这是我得到的错误:

 org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:162) at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:112) at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:300) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:400) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:381) at mhhls.him.dbtoexcel.program.DBtoExcel.selectExcelFile(DBtoExcel.java:159) at mhhls.him.dbtoexcel.program.DBtoExcel.exportToExcel(DBtoExcel.java:422) at mhhls.him.dbtoexcel.ui.main.DBtoExcelWindow$7.actionPerformed(DBtoExcelWindow.java:183) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 

编辑:我改变了selectExcelFile()方法到这个:

 public void selectExcelFile() { String excelFileName = null; // the name/directory/address of the excel file created/selected FileInputStream excelFileIn = null; // allows us to connect to the Excel file so we can read it FileOutputStream excelFileOut = null; // allows us to connect to the Excel file so we can write to it ExcelFileUtility eUtil = new ExcelFileUtility(); // used open an excel file File newFile = null; if(columnsQuery != null) { try { excelFileName = eUtil.getFile(FileExtensions.XLS); if(excelFileName != null) { newFile = new File(excelFileName); if(newFile.exists()) { try { workbook = WorkbookFactory.create(newFile); } catch (EncryptedDocumentException | InvalidFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { if (newFile.getName().endsWith(".xls")) { workbook = new HSSFWorkbook(); } else if (newFile.getName().endsWith(".xlsx")) { workbook = new XSSFWorkbook(); } else { throw new IllegalArgumentException("Must be .xls or .xlsx"); } } excelFileIn = new FileInputStream(newFile); exportColsToWorkbook(columnsQuery); excelFileOut = new FileOutputStream(newFile); workbook.write(excelFileOut); // close everything workbook.close(); excelFileIn.close(); excelFileOut.close(); } } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } 

写在Excel文件工作表上的工作簿据说工作(没有得到任何错误),但是当我打开Excel文件检查,我突然得到这个: 在这里输入图像说明

我点击确定,它只是空的。 没有工作表或工作簿。

这就解释了为什么我下次运行该程序时出现此错误,并尝试在同一个Excel文件上写入工作簿。

 Exception in thread "AWT-EventQueue-0" org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long) at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:216) at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:166) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:278) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:250) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:229) at mhhls.him.dbtoexcel.program.DBtoExcel.selectExcelFile(DBtoExcel.java:205) at mhhls.him.dbtoexcel.program.DBtoExcel.exportToExcel(DBtoExcel.java:487) at mhhls.him.dbtoexcel.ui.main.DBtoExcelWindow$7.actionPerformed(DBtoExcelWindow.java:190) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 

我只是不明白为什么当我尝试写入工作簿到一个新的工作表时为什么会损坏Excel文件。

你似乎错过了一些关键的代码行。 但是,假设您目前正在执行如下操作:

 File newFile = new File("output.xlsx"); if (!newFile.exists) { newFile.createNewFile(); } Workbook wb = WorkbookFactory.create(newFile); 

那么这是行不通的

您只能使用WorkbookFactory来加载预先存在的Excel文件。 您不能使用WorkbookFactory创建一个全新的空白工作簿。 非常相关,如果从InputStreamFile创建一个*SSFWorkbook ,那么你也不能做new HSSFWorkbook(emptyStream)new HSSFWorkbook(emptyFile) ,那么必须存在并被填充。

相反,如果你想创建一个全新的空白工作簿,你需要做的更像是:

 Workbook wb; File newFile = new File("output.xlsx"); if (newFile.exists) { // Load existing wb = WorkbookFactory.create(newFile); } else { // What kind of file are they trying to ask for? // Add additional supported types here if (newFile.getName().endsWith(".xls")) { wb = new HSSFWorkbook(); } else if (newFile.getName().endsWith(".xlsx")) { wb = new XSSFWorkbook(); } else { throw new IllegalArgumentException("I don't know how to create that kind of new file"); } } 

对于全新的空文件,您需要决定要创建的文件类型,然后在没有传入任何流/文件的情况下为其创建适当的*SSFWorkbook实例