当前位置: 首页 > 知识库问答 >
问题:

使用apache poi读取xlsx时,主线程中出现NoSuchMethodError

岳池暝
2023-03-14

我的代码是

[...]
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFRow;

public class ExcelRead {

    public static void main( String [] args ) {
        try {

              File excel = new File("Book1.xlsx");
              FileInputStream fis = new FileInputStream(excel);
              XSSFWorkbook book = new XSSFWorkbook(fis);
              XSSFSheet sheet = book.getSheetAt(0);

            Iterator rows = sheet.rowIterator(); 
            while( rows.hasNext() ) {   
                HSSFRow row = (HSSFRow) rows.next();
                System.out.println("\n");
                Iterator cells = row.cellIterator();
                while( cells.hasNext() ) {

                    HSSFCell cell = (HSSFCell) cells.next();
                    if(HSSFCell.CELL_TYPE_NUMERIC==cell.getCellType())
                    System.out.print( cell.getNumericCellValue()+"     " );
                    else
                    if(HSSFCell.CELL_TYPE_STRING==cell.getCellType())
                        System.out.print( cell.getStringCellValue()+"     " );
                    else
                        if(HSSFCell.CELL_TYPE_BOOLEAN==cell.getCellType())
                        System.out.print( cell.getBooleanCellValue()+"     " );
                        else
                            if(HSSFCell.CELL_TYPE_BLANK==cell.getCellType())
                                System.out.print( "BLANK     " );
                                else
                            System.out.print("Unknown cell type");
                }
            }
        } catch ( IOException ex ) {
            ex.printStackTrace();
        }
    }
}

我添加的罐子是

  • 波伊-3.9.jar
  • 3.9.jar
  • poi-ooxml-schemas-3.7.jar
  • 2.3.0.jar
  • dom4j-1.6.1.jar

例外的是

 Exception in thread "main" java.lang.NoSuchMethodError: javax.xml.stream.XMLEventFactory.newFactory()Ljavax/xml/stream/XMLEventFactory;

      at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:45)
      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.Package.<init>(Package.java:37)
      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:254)
      at com.symplocus.ExcelRead.main(ExcelRead.java:26)

共有3个答案

鞠隐水
2023-03-14

我遇到了与您完全相同的问题,我发现必须使用以下jar文件来解决该程序:

  • poi-bin-3.8.zip
  • opencsv-2.3.jar
  • poi-ooxml-3.8.jar
  • poi-ooxml-schemas-3.8.jar
  • xmlbeans-2.3.0.jar
  • dom4j-1.6.1.jar

更新的版本会带来麻烦。

尚恩
2023-03-14

这通常表明您以某种方式拖入过时的XML解析器接口,例如,通过一些暂时性依赖关系到旧的xml-api版本或过时的xerces jar,通常不再需要它,因为Java 6提供了所有开箱即用的XML解析功能。

更多细节见本讨论。

章阳波
2023-03-14

poi-ooxml的最新版本要求您至少使用java 6。有问题的方法仅在java 6之后添加。考虑升级您的java版本。

从官方文件来看,

OOXML 罐子需要一个斯塔克斯实现,但现在 Apache POI 需要 Java 6,这是由 JRE 提供的,不需要额外的斯塔克斯罐。OOXML 罐子过去需要 DOM4J,但现在代码已更改为使用 JAXP,不需要额外的 dom4j 罐子。

*强调我的。

由于问题已编辑,我将指定添加此方法的版本:

爪哇 1.6.0_18

所以在OP的情况下,必须至少使用这个版本。

 类似资料:
  • 问题内容: 我的代码是 我添加的罐子是 poi-3.9.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.7.jar xmlbeans-2.3.0.jar dom4j-1.6.1.jar 例外是 问题答案: 最新版本的要求您至少使用。自以来,仅添加了有问题的方法。考虑升级您的版本。 根据官方文档, OOXML jar需要一个stax实现,但是 现在Apache P

  • 我正在写一个程序,它需要从excel文件中读取和写入数据,而不考虑格式(xls或xlsx)。 我知道ApachePOI,但它似乎有不同的类来处理xls文件(HSSF)和xlsx(XSSF)文件。 任何人都知道我将如何实现我在这里的目标。(也欢迎使用POI以外的API的想法)。

  • 我返回了一个代码,使用jsoup-1.7.3.jar读取网页,它对一些网站有效,但对一些URL显示读取超时错误。 线程“main”java.net.SocketTimeoutException中的异常:java.net.SocketInputStream.socketRead0(本机方法)处java.net.SocketInputStream.Read(SocketInputStream.java

  • 我需要帮助在阅读xlsx文件,也使用密码解锁,正如上面所做的。

  • 问题内容: 我正在使用Apache POI(XSSF API)来读取xlsx文件。当我尝试读取file.i时出现以下错误: 码: 请帮助我解决此问题。 谢谢 问题答案: 该错误告诉您POI找不到OOXML文件的核心部分,在这种情况下为内容类型部分。您的文件不是有效的OOXML文件,更不用说有效的.xlsx文件了。不过,这是一个有效的zip文件,否则您将遇到较早的错误 Excel可以真正加载该文件吗

  • 因此,我一直在使用Python3.2和OpenPyXL的iterable工作簿,如这里的“优化阅读器”示例所示。 当我尝试使用此策略读取从简单文档中提取的一个或多个文件时,就会出现问题。zip存档(手动和通过python zipfile包)。当我调用我得到“A”和我得到1,当要求打印每个单元格的值时,如下所示: 它打印A1、A2、A3、A4、A5、A6和A7中的值,而不管文件实际有多大。文件本身没