NotOLE2FileException:标头签名无效;读取 0x0000000000000000,预期为 0xE11AB1A1E011CFD0 - 文件似乎不是有效的 OLE2 文档

Jay*_*hod 5 java apache-poi

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();
    }
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 java 创建简单的 Excel 文件。我收到上述错误。

Gag*_*arr 1

你的问题是这里的这一行:

    if (!file.exists()) file.createNewFile();
Run Code Online (Sandbox Code Playgroud)

这将创建一个全新的 0 字节文件,该文件不是有效的 Excel 文件。这就是 POI 反对的原因。

此外,您使用的是旧版本的 Apache POI。如果您愚蠢地要求他们读取零字节文件,较新的文件会提供更有用的例外

考虑到Files 与 InputStreams 的建议,但请注意您正在进行就地写入,而打开的 File 尚未完全支持该写入,请将代码更改为更像:

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));
}
Run Code Online (Sandbox Code Playgroud)

这适用于.xls.xlsx文件,并避免您的错误

虽然您确实也应该升级您的 Apache POI 版本......

  • 良好的举止是必须的。您不需要侮辱发布问题的人。 (4认同)