当前位置: 首页 > 面试题库 >

使用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();
        }
    }
}

我添加的罐子是

  • 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

例外是

 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)

问题答案:

最新版本的poi-ooxml要求您至少使用java 6。自以来,仅添加了有问题的方法java 6。考虑升级您的java版本。

根据官方文档,

OOXML jar需要一个stax实现,但是 现在Apache POI需要 Java 6 ,它由JRE提供,并且不需要其他stax
jar。OOXML jar曾经需要DOM4J,但是现在代码已更改为使用JAXP,并且不需要其他dom4j jar。

*强调我的。

由于问题已被编辑,因此我指定添加此方法的构建:

Java 1.6.0_18

因此,在OP的情况下,必须至少使用此版本。



 类似资料:
  • 我的代码是 我添加的罐子是 波伊-3.9.jar 3.9.jar poi-ooxml-schemas-3.7.jar 2.3.0.jar dom4j-1.6.1.jar 例外的是

  • 我正在写一个程序,它需要从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中的值,而不管文件实际有多大。文件本身没