【问题标题】:NoSuchMethodError in main thread while reading xlsx using apache poi使用 apache poi 读取 xlsx 时主线程中出现 NoSuchMethodError
【发布时间】:2014-11-11 13:48:39
【问题描述】:

我的代码是

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

【问题讨论】:

  • 你用的是哪个java版本?
  • java标准版6
  • 代码在 jdk7 上运行良好 ........

标签: java excel exception apache-poi


【解决方案1】:

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

来自official docs

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

*强调我的。

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

java 1.6.0_18

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

【讨论】:

  • 你的运行时 6 也一样吗?
  • 这很奇怪。我仍然怀疑您在java 5 或更少的平台上运行。您正在运行 java 6 的哪个版本?只需将此行放在引发错误的行之前。 System.out.println(Runtime.class.getPackage().getImplementationVersion()); 并在此处粘贴输出。
  • 你至少应该使用 build 18。upstream.rosalinux.ru/java/compat_reports/jdk/…
  • java 6 的patch-level 可能不会对此产生影响,更有可能是第三方库过时造成的,可能是xml-apis 或xerces
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我遇到了和你一样的问题, 我发现必须使用以下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

    新版本会带来麻烦。

    【讨论】:

    • 我被困了两个小时,这终于是我的答案。
    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2013-03-11
    相关资源
    最近更新 更多