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

时间:2014-11-11 13:48:40

标签: java excel exception apache-poi

我的代码是

[...]
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-架构-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)

3 个答案:

答案 0 :(得分:5)

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

来自official docs

  

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

*强调我的。

由于问题已编辑,我正在指定构建此方法为added

  

java 1.6.0_18

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

答案 1 :(得分:1)

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

有关详细信息,请参阅this discusion

答案 2 :(得分:0)

我遇到了与你完全相同的问题。 我发现必须使用以下jar文件来解决该程序: poi-bin-3.8.zip opencsv-2.3.jar POI-OOXML-3.8.jar POI-OOXML-模式-3.8.jar XMLBeans的-2.3.0.jar DOM4J-1.6.1.jar

较新的版本会带来麻烦。