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

我的代码是

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

我添加的jar子是

  • POI-3.9.jar
  • POI-OOXML-3.9.jar
  • POI-OOXML-模式-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最新版本要求您至less使用java 6 。 有问题的方法只是自java 6添加。 考虑升级你的java版本。

从官方文件来看,

OOXML jar需要stax实现,但是现在Apache POI需要 Java 6 ,而JRE提供的并不需要额外的stax jar。 用于需要DOM4J的OOXMLjar子,但是现在代码已经改为使用JAXP,并且不需要额外的dom4jjar子。

*强调我的。

由于这个问题被编辑了,我指定了这个方法的构build:

java 1.6.0_18

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

这通常表示您以某种方式拖拽了过时的XMLparsing器接口,例如通过一些临时依赖关系拖拽到一个旧的xml-api版本或过时的xerces jar,这通常不再需要,因为Java 6提供了所有的XMLparsingfunction的框。

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

我遇到了和你一样的问题。 我发现下面的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

新版本会带来麻烦。