使用apache poi读取xlsx时主线程中的NoSuchMethodError

时间:2023-01-28 20:24:16

my code is

我的代码是

[...]
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();
        }
    }
}

the jars that i have added are

我添加的罐子是

  • poi-3.9.jar
  • POI-3.9.jar
  • poi-ooxml-3.9.jar
  • POI-OOXML-3.9.jar
  • poi-ooxml-schemas-3.7.jar
  • POI-OOXML-模式-3.7.jar
  • xmlbeans-2.3.0.jar
  • XMLBeans的-2.3.0.jar
  • dom4j-1.6.1.jar
  • dom4j的-1.6.1.jar

the exception is

例外是

 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 个解决方案

#1


5  

Recent versions of poi-ooxml require you to use at least java 6. The method in question was only added since java 6. Consider upgrading your java version.

最新版本的poi-ooxml要求你至少使用java 6.这个方法只是在java 6之后才添加。考虑升级你的java版本。

From the official docs,

从官方文档来看,

The OOXML jars require a stax implementation, but now that Apache POI requires Java 6, that is provided by the JRE and no additional stax jars are required. The OOXML jars used to require DOM4J, but the code has now been changed to use JAXP and no additional dom4j jars are required.

OOXML jar需要stax实现,但现在Apache POI需要Java 6,这是由JRE提供的,不需要额外的stax jar。 OOXML jar用于需要DOM4J,但代码现已更改为使用JAXP,并且不需要额外的dom4j jar。

*Emphasis mine.

*强调我的。

Since the question was edited, I'm specifying the build this method was added:

由于问题已被编辑,我正在指定构建此方法的方法:

java 1.6.0_18

java 1.6.0_18

So a minimum of this version must be used in OP's case.

因此,必须在OP的情况下使用此版本的最小值。

#2


1  

This usually indicates that you somehow drag in outdated XML Parser interfaces, e.g. via some transient dependency to an old xml-api version or an outdated xerces jar, which is usually not needed any more at all as Java 6 provides all the XML parsing functionality out of the box.

这通常表示您以某种方式拖动过时的XML Parser接口,例如通过对旧的xml-api版本或过时的xerces jar的一些暂时依赖,由于Java 6提供了开箱即用的所有XML解析功能,因此通常根本不再需要它。

See this discusion for some more details.

有关更多详细信息,请参阅此讨论。

#3


0  

I ran into exactly the same issue as you. and I found the following jar files have to be used to solve the program: 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

我遇到了与你完全相同的问题。我发现必须使用以下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

newer version will bring trouble.

较新版本会带来麻烦。

#1


5  

Recent versions of poi-ooxml require you to use at least java 6. The method in question was only added since java 6. Consider upgrading your java version.

最新版本的poi-ooxml要求你至少使用java 6.这个方法只是在java 6之后才添加。考虑升级你的java版本。

From the official docs,

从官方文档来看,

The OOXML jars require a stax implementation, but now that Apache POI requires Java 6, that is provided by the JRE and no additional stax jars are required. The OOXML jars used to require DOM4J, but the code has now been changed to use JAXP and no additional dom4j jars are required.

OOXML jar需要stax实现,但现在Apache POI需要Java 6,这是由JRE提供的,不需要额外的stax jar。 OOXML jar用于需要DOM4J,但代码现已更改为使用JAXP,并且不需要额外的dom4j jar。

*Emphasis mine.

*强调我的。

Since the question was edited, I'm specifying the build this method was added:

由于问题已被编辑,我正在指定构建此方法的方法:

java 1.6.0_18

java 1.6.0_18

So a minimum of this version must be used in OP's case.

因此,必须在OP的情况下使用此版本的最小值。

#2


1  

This usually indicates that you somehow drag in outdated XML Parser interfaces, e.g. via some transient dependency to an old xml-api version or an outdated xerces jar, which is usually not needed any more at all as Java 6 provides all the XML parsing functionality out of the box.

这通常表示您以某种方式拖动过时的XML Parser接口,例如通过对旧的xml-api版本或过时的xerces jar的一些暂时依赖,由于Java 6提供了开箱即用的所有XML解析功能,因此通常根本不再需要它。

See this discusion for some more details.

有关更多详细信息,请参阅此讨论。

#3


0  

I ran into exactly the same issue as you. and I found the following jar files have to be used to solve the program: 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

我遇到了与你完全相同的问题。我发现必须使用以下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

newer version will bring trouble.

较新版本会带来麻烦。