有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用apache poi读取xlsx时,主线程中出现java 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();
        }
    }
}

我添加的罐子是

  • poi-3.9。罐子
  • poi-ooxml-3.9。罐子
  • poi-ooxml-schemas-3.7。罐子
  • xmlbeans-2.3.0。罐子
  • dom4j-1.6.1。罐子

例外是

 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. # 1 楼答案

    这通常表示您以某种方式引入了过时的XML解析器接口,例如,通过对旧的XML api版本或过时的xerces jar的某种暂时依赖,这通常不再需要,因为Java 6提供了所有现成的XML解析功能

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

  2. # 2 楼答案

    我遇到了和你完全一样的问题, 我发现必须使用以下jar文件来解决该程序:

    • poi-bin-3.8。拉链
    • opencsv-2.3。罐子
    • poi-ooxml-3.8。罐子
    • poi-ooxml-schemas-3.8。罐子
    • xmlbeans-2.3.0。罐子
    • dom4j-1.6.1。罐子

    更新的版本会带来麻烦

  3. # 3 楼答案

    最近版本的poi-ooxml要求您至少使用java 6。自java 6起,才添加了有问题的方法。考虑升级您的{{CD4}}版本。

    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.

    *我的

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

    java 1.6.0_18

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