【问题标题】:NoSuchMethodError (initialization failure) while reading excel xlsx file using apache poi使用 apache poi 读取 excel xlsx 文件时出现 NoSuchMethodError(初始化失败)
【发布时间】:2015-03-24 14:44:39
【问题描述】:

我尝试申请apache poi,但失败了。我一直在寻找解决方案,但仍然无法解决问题。不确定java版本是否不兼容或缺少jar文件。我需要专业人士的指导。

system.out 之后的当前版本: 1.6.0 System.out.println(Runtime.class.getPackage().getImplementationVersion());

已添加外部 Jar 文件:
- dom4j-1.6.1.jar
- log4j-1.2.17.jar
- junit-4.11.jar
- poi-3.11-20141211.jar
- poi-ooxml-3.11-20141211.jar
- poi-ooxml-schemas-3.11-20141211.jar
- xmlbeans-2.6.0.jar

JSP 文件

//jsp is my front end system

<jsp:useBean id="ReadXLSXFile" scope="page" class="com.home.file.ReadXLSXFile" />
<script>
    if(sType.equals("Y"))
    {
      ReadXLSXFile.main(null);
    }
</script>

Java 文件

package com.home.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
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 ReadXLSXFile {

public static void main(String[] args) {

    try {
        File excel = new File("C:/Banklist.xlsx");
        FileInputStream fis = new FileInputStream(excel);
        XSSFWorkbook book = new XSSFWorkbook(fis);
        XSSFSheet sheet = book.getSheetAt(0);

        Iterator<Row> itr = sheet.iterator();

        // Iterating over Excel file in Java
        while (itr.hasNext()) {
            Row row = itr.next();

            // Iterating over each column of Excel file
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {

                Cell cell = cellIterator.next();

                switch (cell.getCellType()) {
                case Cell.CELL_TYPE_STRING:
                    System.err.print(cell.getStringCellValue() + "\t");
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    System.err.print(cell.getNumericCellValue() + "\t");
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    System.err.print(cell.getBooleanCellValue() + "\t");
                    break;
                default:

                }
            }
            System.err.println("");
        }

    } catch (FileNotFoundException fe) {
        fe.printStackTrace();
    } catch (IOException ie) {
        ie.printStackTrace();
    }
}
}

读取excel文件.xlsx后出现错误

Eclipse 控制台结果:

Caused by: java.lang.NoClassDefFoundError: org.apache.poi.openxml4j.opc.internal.marshallers.ZipPackagePropertiesMarshaller (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161)
at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:141)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:87)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:272)
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:258)
at com.rexit.easc.ReadXLSXFile.main(ReadXLSXFile.java:26)
at com.ibm._jsp._pop_5F_cnFW_5F_nstbl._jspService(_pop_5F_cnFW_5F_nstbl.java:500)

P/s:这个问题与这个线程非常相似,但我仍然无法弄清楚。 Here

【问题讨论】:

  • 我最好的猜测是您的类路径中还有一个较旧的 POI 版本。你能检查一下是否还有其他 POI jar 吗?
  • 谢谢,问题解决了。

标签: java excel exception apache-poi noclassdeffounderror


【解决方案1】:

poi-3.11-20141211.jar 中缺少 org.apache.poi.openxml4j.opc.internal.marshallers.ZipPackagePropertiesMarshaller。
首先,您可以检查 ZipPackagePropertiesMarshaller 类是否在此 jar 中。
如果没有,可能是您的 poi-3.11-20141211.jar 无效或 ZipPackagePropertiesMarshaller 不支持 poi-3.11-20141211.jar。

I would recommend you to change poi-ooxml-3.11-20141211.jar to poi-ooxml-3.9-20121203.jar.

【讨论】:

  • 您好,感谢您的回复。我将 jar 文件版本从 3.11 切换到 3.9 poi-3.9-20121203.jarpoi-ooxml-3.9-20121203.jarpoi-ooxml-schemas-3.9-20121203.jar。一旦我重建我的项目并运行,它就会显示此错误消息。 NoSuchMethodError: javax/xml/stream/XMLEventFactory.newFactory()Ljavax/xml/stream/XMLEventFactory;at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.&lt;clinit&gt;(PackagePropertiesMarshaller.java:45)
  • 为什么建议降级?他们会错过错误修复和新功能!
  • @Gagravarr,因为我的 3.9 环境适合这种情况。
  • 如果他们的类路径上有旧版本,那么无论他们放 3.9、3.11 还是夜间快照,它都会被类路径上的旧版本破坏!
【解决方案2】:

使用 1.6.20 或更高版本的 jdk 来处理 XSSFWorkbook。 你的 jdk 版本应该高于 1.6.20

【讨论】:

  • 这与jdkversion无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多