【问题标题】:Apache POI XSSFWorkbook throwing NullPointerException for fileApache POI XSSFWorkbook 为文件抛出 NullPointerException
【发布时间】:2020-04-15 17:59:09
【问题描述】:

我已经检查了这里所有可能的问题,都有类似的问题,但没有一个解决方案有效。我觉得我错过了一些非常明显的东西,但我就是看不到它。

我在 Windows 10 上,使用 Eclipse 2019,以及带有 xmlbeans 版本 3.1.0 的最新 Apache POI jar 文件(不是 maven)。我想读取一个 xlsx 文件,但每次我运行我的代码(这是我在多个网站和视频上成功使用并成功运行的一个基本示例)时,我都会在创建工作簿的行收到“NullPointerException” :

import java.io.File;
//import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
//import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class excelImportTest {


    public static void main (String args[]) throws IOException, InvalidFormatException {

      // Linking file to Workbook
      // ****Where exception is called every time****
      XSSFWorkbook wb = new XSSFWorkbook(new File("C:\\Users\\Owner\\Downloads\\TestData.xlsx"));

      // Pulling sheet from Workbook
      XSSFSheet sheet = wb.getSheetAt(0);

      // Get iterator to all the rows in current sheet
      Iterator<Row> rowIterator = sheet.iterator();

      // Traversing over each row of XLSX file
      while (rowIterator.hasNext()) {
          Row row = rowIterator.next();

          // For each row, iterate through each columns
          Iterator<Cell> cellIterator = row.cellIterator();

          while (cellIterator.hasNext()) {
              Cell cell = cellIterator.next();
              switch(cell.getCellType()) {
              case STRING:
                  System.out.print(cell.getStringCellValue() + "\t");
                  break;
              case NUMERIC:
                  System.out.print(cell.getNumericCellValue() + "\t");
                  break;
              case BOOLEAN:
                  System.out.print(cell.getBooleanCellValue() + "\t");
                  break;
              default :
              }
          }
      }
      wb.close();

这是我收到的异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at sun.misc.Unsafe.ensureClassInitialized(Native Method)
    at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(Unknown Source)
    at sun.reflect.ReflectionFactory.newFieldAccessor(Unknown Source)
    at java.lang.reflect.Field.acquireFieldAccessor(Unknown Source)
    at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
    at java.lang.reflect.Field.get(Unknown Source)
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:775)
    at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument.<clinit>(Unknown Source)
    at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(Unknown Source)
    at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:86)
    at org.apache.poi.ooxml.POIXMLFactory.createDocumentPart(POIXMLFactory.java:61)
    at org.apache.poi.ooxml.POIXMLDocumentPart.read(POIXMLDocumentPart.java:684)
    at org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:180)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:288)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:325)
    at excelImportTest.main(excelImportTest.java:62)
Caused by: java.lang.RuntimeException: Could not instantiate SchemaTypeSystemImpl (java.lang.reflect.InvocationTargetException): is the version of xbean.jar correct?
    at schemaorg_apache_xmlbeans.system.sD023D6490046BA0250A839A9AD24C443.TypeSystemHolder.loadTypeSystem(Unknown Source)
    at schemaorg_apache_xmlbeans.system.sD023D6490046BA0250A839A9AD24C443.TypeSystemHolder.<clinit>(Unknown Source)
    ... 16 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    ... 18 more
Caused by: java.lang.NullPointerException
    at org.apache.xmlbeans.impl.schema.ClassLoaderResourceLoader.getResourceAsStream(ClassLoaderResourceLoader.java:33)
    at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl$XsbReader.getLoaderStream(SchemaTypeSystemImpl.java:2249)
    at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl$XsbReader.<init>(SchemaTypeSystemImpl.java:1522)
    at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.initFromHeader(SchemaTypeSystemImpl.java:273)
    at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.<init>(SchemaTypeSystemImpl.java:185)
    ... 22 more

我已经尝试了所有我能想到的选项和我在网上找到的建议:

  • 我创建了一个单独的 FileInputStream(new File(...)),并运行了一个 if 语句来查看它是否为空。这返回了“not null”,但是当它到达上面的行时我仍然得到了异常
  • 我尝试使用嵌套的 new FileInputStream(new File(...)) 格式运行该行,并收到相同的错误
  • 我一直在对异常使用 try-catch 块,但在中止程序之前它似乎没有标记异常
  • 我尝试使用包含 Apache-POI 的 OCPPackage.open(new File(...)) 方法,但得到了同样的错误

我是否缺少任何明显的方法,或者这是否源于我的设置中的其他问题?

编辑

由于我的问题似乎出在我所引用的 .jar 文件中,因此这是我作为文件构建路径的一部分所拥有的内容:

【问题讨论】:

  • @AnishB。我正在使用 Apache POI 4.1.2
  • @AxelRichter 我添加了 ClassLoader 代码,但现在收到:'java.net.URL res = classloader.getResource(" org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.class");'线。这是否意味着我根本没有连接到任何类型的 xmlBeans 文件?
  • @AnishB。不,我没有运行任何其他代码 - 我想在添加更多功能之前设置此连接。
  • 你能试试:ClassLoader classloader = org.apache.xmlbeans.XmlBeans.class.getClassLoader(); java.net.URL res = classloader.getResource("org/apache/xmlbeans/XmlBeans.class"); String path = res.getPath(); System.out.println("XmlBeans came from " + path); 作为main 方法中的第一行代码吗?它打印什么? XmlBeans 类在你的系统中来自哪里?
  • 对不起,那我就帮不上忙了。似乎在运行时类路径中没有任何xmlbeans*.jar,或者没有可用于org.apache.xmlbeans.XmlBeans.class 的类加载器。我不知道Eclipse 的错误配置会导致什么。也许有些Eclipse 专家知道。

标签: java apache-poi


【解决方案1】:

我认为你没有正确添加罐子。

首先转到这个网址:https://archive.apache.org/dist/poi/release/bin/ 并从那里下载poi-bin-4.1.2-20200217.zip

现在解压缩 zip 并将这个 jars 添加到您的项目中,并用红色标记。

我已经测试了您的代码及其工作。

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Testing {
    public static void main(String args[]) throws IOException, InvalidFormatException {

        // Linking file to Workbook
        // ****Where exception is called every time****
        XSSFWorkbook wb = new XSSFWorkbook(new File("C:\\Users\\Anish\\Downloads\\TestData.xlsx"));

        System.out.println("Workbook loaded");

        // Pulling sheet from Workbook
        XSSFSheet sheet = wb.getSheetAt(0);

        // Get iterator to all the rows in current sheet
        Iterator<Row> rowIterator = sheet.iterator();

        // Traversing over each row of XLSX file
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();

            // For each row, iterate through each columns
            Iterator<Cell> cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                switch (cell.getCellType()) {
                case STRING:
                    System.out.print(cell.getStringCellValue() + "\t");
                    break;
                case NUMERIC:
                    System.out.print(cell.getNumericCellValue() + "\t");
                    break;
                case BOOLEAN:
                    System.out.print(cell.getBooleanCellValue() + "\t");
                    break;
                default:
                }
            }
        }
        wb.close();

    }
}

输出:

现在,如果您在项目中使用 maven。那么,您不需要在类路径中添加 jars。

只需在pom.xml 中添加此依赖项。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

【讨论】:

  • 很遗憾,不,这并没有解决问题。我什至删除了以前的 apache poi 文件并从网站重新下载了 jar 的 .zip,并将它们重新添加回文件的构建路径,但仍然收到完全相同的错误。
  • @KatherineBowers 我可以在屏幕截图中看到您正在使用 maven。你在用 maven 吗?如果您在项目中使用 maven,我已经更新了我对 maven 的回答。
  • 我以前从未使用过 maven,据我所知目前没有使用它 - 我不确定您在我的屏幕截图中的哪个位置看到它?它仍然无法正常工作 - 我提取了 zip 文件,并完全按照你所做的顺序将 JAR 添加到构建路径中 - 我在想我在 eclipse 中所做的任何事情都没有建立连接,所以我要现在尝试使用 maven 看看会发生什么。
  • @KatherineBowers 尝试创建一个新项目并检查其是否正常工作。
  • 我从一个全新的项目开始,现在有一个不同的错误 - java.lang.NoClassDefFoundError: org/apache/poi/openxml4j/exceptions/InvalidFormatException 我的 jar 中似乎没有包含异常信息?
【解决方案2】:

所以经过多次故障排除,我放弃了使用 Apache POI jar 文件,转而使用 maven 并添加 apache poi 作为依赖项,我的代码现在可以成功运行。

也感谢所有提供帮助和建议的人,尽管我仍然不确定 Eclipse 和 POI jar 文件之间的通信问题的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2018-04-29
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多