xssfworkbook空指针异常,Apache POI XSSFWorkbook抛出NullPointerException文件

I have checked every possible question on here with a similar problem, and none of the solutions have worked. I feel like I am missing something really obvious, but I just can't see it.

I am on Windows 10, using Eclipse 2019, and the newest Apache POI jar files (not maven) with xmlbeans version 3.1.0. I want to read an xlsx file, but every time I run my code (Which is a basic example I've seen used and run successfully on multiple websites and videos), I receive a "NullPointerException" at the line where I create my workbook:

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

Here is the exception I receive:

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.(Unknown Source)

at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(Unknown Source)

at org.apache.poi.xssf.model.ThemesTable.(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.(XSSFWorkbook.java:288)

at org.apache.poi.xssf.usermodel.XSSFWorkbook.(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.(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.(SchemaTypeSystemImpl.java:1522)

at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.initFromHeader(SchemaTypeSystemImpl.java:273)

at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.(SchemaTypeSystemImpl.java:185)

... 22 more

I have tried every combination of options I can think of and suggestions I have found online:

I created a separate FileInputStream(new File(...)), and ran an if statement to see if it was null. This returned "not null", but I still got the exception when it got to the line above

I tried running the line with a nested new FileInputStream(new File(...)) format, and received the same error

I have been using a try-catch block for the exception, but it does not seem to flag the exception before aborting the program

I have tried using the Apache-POI-included OCPPackage.open(new File(...)) approach, and get the same error

Is there any obvious approach I am missing, or does this stem from some other issue in my setup?

Edit

Since it seems my problem may be in the .jar files I am referencing, here is what I have as part of the file's build path:

HhmJC.png

解决方案

I think you have not added the jars properly.

First go to this url : https://archive.apache.org/dist/poi/release/bin/ and download poi-bin-4.1.2-20200217.zip from there.

Now extract the zip and add this jars to your project marked with red.

Ax8jv.png

05C0k.png

zuKKu.png

I have tested your code and its working.

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

}

}

Output :

1f0pJ.png

Now, if you are using maven in the project.Then, you don't need to add jars on the classpath.

Simply, add this dependency in the pom.xml.

org.apache.poi

poi

4.1.2

org.apache.poi

poi-ooxml

4.1.2