gpt4 book ai didi

java - Apache POI XSSFWorkbook 为文件抛出 NullPointerException

转载 作者:行者123 更新时间:2023-12-04 10:12:52 34 4
gpt4 key购买 nike

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

我在 Windows 10 上,使用 Eclipse 2019,以及最新的 Apache POI jar 文件(不是 maven)和 xmlbeans 版本 3.1.0。我想读取一个 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 文件中,以下是我作为文件构建路径的一部分的内容:

    enter image description here

    最佳答案

    我认为您没有正确添加 jar 。

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

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

    enter image description here

    enter image description here

    enter image description here

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

    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();

    }
    }

    输出 :

    enter image description here

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

    简单地,在 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>

    关于java - Apache POI XSSFWorkbook 为文件抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61235460/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com