【问题标题】:Apache Poi 3.13 can't find classes to open XLSX filesApache Poi 3.13 找不到打开 XLSX 文件的类
【发布时间】:2016-02-15 01:27:36
【问题描述】:

我正在使用 apache POI 使用 Java 读取和写入 Excels 文件,但我无法在源中找到 WorkbookFactory 或 XSSFWorkbook 来读取 xlsx 文件。

pom.xml:

<poi.version>3.13</poi.version>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>${poi.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>${poi.version}</version>
</dependency>

我在 apache poi 的变更日志中也找不到任何可能导致这种行为的信息。

编辑: 这是我的实现(暂时只是一个简单的方法)

public static HSSFSheet getXLSSheet(String fileName, int sheetIndex) throws IOException {
    InputStream inputStream = new FileInputStream(fileName);
    HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
    return workbook.getSheetAt(sheetIndex);
}

我试图打开一个 XLSX 文件,但由于我找不到其他两个类(WorkbookFactory 或 XSSFWorkbook),所以我预计会遇到这样的错误:

org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

提前致谢。

【问题讨论】:

    标签: java excel maven apache-poi


    【解决方案1】:

    XSSFWorkbook 出现在 Apache POI 3.11 版本中。

    Source code of apache POI

    尝试使用这个版本的apache poi。

    此外,它仍然存在于后备箱中:

    Source code of apache POI

    我相信问题出在您的 Maven 本地存储上。尝试从 maven 本地存储库中删除 poi 文件夹并重新下载依赖项。

    同时不要忘记将所有呼叫从 HSSFWorkbook 更改为 XSSFWorkbook,因为 XLSX 文件仅通过 XSSFWorkbook 打开。

    【讨论】:

      【解决方案2】:

      首先,我可以向您保证 WorkbookFactory 和 XSSFWorkbook 类包含在 POI-OOXML 3.13 jar 中,如 documented on the POI site

      $ unzip -l .m2/repository/org/apache/poi/poi-ooxml/3.13/poi-ooxml-3.13.jar | grep WorkbookFactory
        6041  2015-09-22 00:22   org/apache/poi/ss/usermodel/WorkbookFactory.class
      

      但是,正如您发布的例外情况所表明的那样,您的代码将永远无法用于XLSX 文件,它需要更改。好吧,对于那个和其他一些问题......例如Don't use an InputStream if you have a File

      您的代码应该更像:

      import java.io.File;
      import org.apache.poi.ss.usermodel.*;
      
      public static Sheet getExcelSheet(String fileName, int sheetIndex) throws IOException {
         File file = new File(fileName);
         Workbook workbook = WorkbookFactory.create(file);
         return workbook.getSheetAt(sheetIndex);
      }
      

      这对xls 和xlsx 文件都有效,并且比使用输入流的内存要低。只要你告诉 maven 依赖 poi-ooxml jar,你就会自动得到你需要的所有其他依赖项

      【讨论】:

      • 我知道它不会起作用。但是感谢您发现它是在3.13版本中。我发现 IDE 存在错误,因为某些依赖项未加载。现在一切正常。我也改成 File 而不是 InputStream (但为了测试目的我尝试了最快的方法)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多