Apache POI XSSFWorkbook выбрасывает исключение NullPointerException для файла - PullRequest
3 голосов
/ 15 апреля 2020

Я проверил здесь все возможные вопросы с похожей проблемой, и ни одно из решений не сработало. Я чувствую, что мне не хватает чего-то действительно очевидного, но я просто не вижу этого.

Я на Windows 10, использую Eclipse 2019 и новейшие файлы Apache POI jar (не maven) с версией xmlbeans 3.1.0. Я хочу прочитать файл xlsx, но каждый раз, когда я запускаю свой код (который является базовым c примером, который я видел, использовал и успешно запускаю на нескольких сайтах и ​​видео), я получаю «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 (новый файл (...)) и запустил оператор if, чтобы увидеть, было ли оно пустым. Это вернуло «не ноль», но я все еще получил исключение, когда оно добралось до строки выше
  • Я попытался запустить строку с вложенным новым форматом FileInputStream (новый файл (...)) и получил та же ошибка
  • Я использовал блок try-catch для исключения, но, похоже, он не помечает исключение перед прерыванием программы
  • Я пытался использовать Apache -POI OCPPackage.open (новый файл (...)) и включает ту же ошибку

Есть ли какой-то очевидный подход, который мне не хватает, или это связано с какой-то другой проблемой в моей настройке? ?

Редактировать

Поскольку кажется, что моя проблема может быть в файлах .jar, на которые я ссылаюсь, вот что у меня есть как часть пути сборки файла:

enter image description here

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Я думаю, что вы не добавили банки должным образом.

Сначала go к этому URL: https://archive.apache.org/dist/poi/release/bin/ и загрузите poi-bin-4.1.2-20200217.zip оттуда.

Теперь извлеките почтовый индекс и добавьте эти банки в ваш проект, помеченный красным.

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-файлы в classpath.

Просто добавьте эту зависимость в 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>

Надеюсь, это поможет вам.

0 голосов
/ 16 апреля 2020

Итак, после долгих устранения неполадок, я отказался от использования Apache файлов jar POI и переключился на использование maven и добавил apache poi в качестве зависимости, и мой код теперь работает успешно.

Спасибо вам тоже все, кто помогал и делал предложения, хотя я все еще не уверен в происхождении проблемы связи между Eclipse и файлами jar POI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...