【问题标题】:NoSuchFieldError when reading Excel sheet in java在java中读取Excel工作表时出现NoSuchFieldError
【发布时间】:2016-06-03 15:34:53
【问题描述】:

我遵循了使用 Apache POI XSSF 构建工作簿的简单指南。按照相同的指南,我能够编写 Excel 工作表,但是当尝试从其中读取时,我收到代码后显示的错误。

代码:

try {
    FileInputStream file = new FileInputStream(new File("howtodoinjava_demo.xlsx"));

    // Create Workbook instance holding reference to .xlsx file
    XSSFWorkbook workbook = new XSSFWorkbook(file);

    // Get first/desired sheet from the workbook
    XSSFSheet sheet = workbook.getSheetAt(0);

    // Iterate through each rows one by one
    Iterator<Row> rowIterator = sheet.iterator();
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        // For each row, iterate through all the columns
        Iterator<Cell> cellIterator = row.cellIterator();

        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            // Check the cell type and format accordingly
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC:
                System.out.print(cell.getNumericCellValue() + "t");
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue() + "t");
                break;
            }
        }
        System.out.println("");
    }
    file.close();
} catch (Exception e) {
    e.printStackTrace();
}

错误输出:

线程“主”java.lang.NoSuchFieldError 中的异常: RAW_XML_FILE_HEADER 位于 org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:179) 在 org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:228) 在 org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:93) 在 org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:294) 在 org.apache.poi.util.PackageHelper.open(PackageHelper.java:37) 在 org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:273) 在 com.wtolliver.spring.test.ReadExcel.readExcel(ReadExcel.java:18) 在 com.wtolliver.spring.test.App.main(App.java:17)

【问题讨论】:

  • 您确定 Excel 文件状态良好吗?看起来它可能已损坏。
  • 这个NoSuchFieldError主要源于apache-poi dependencies之间的版本不匹配

标签: java xssf nosuchfieldexception


【解决方案1】:

看了一圈之后。我浏览了documentation for APACHE POI,发现这是常量之一(我不知道它的真正含义)。

但最终,我意识到我使用的所有教程都是 2014 年之前的。

所以我刚刚将我的 Maven POM 更改为 3.11 版本,用于 apache-poipoi-ooxml 的两个依赖项。

它现在可以工作了。

【讨论】:

  • 我建议改进格式并添加指向所述文档的链接。
【解决方案2】:

我得到了相同的错误与不同的常数:

线程“主”java.lang.NoSuchFieldError 中的异常:RETURN_NULL_AND_BLANK

谷歌搜索了很多,但没有答案。我使用的是 apache poi-ooxml 3.11 版。后来我改到3.17版。然后它工作正常。

希望这可能对某人有所帮助。

【讨论】:

    【解决方案3】:

    如果有人使用最新的 Apache POI 库,请确保添加了这些依赖项,它绝对可以正常工作。

     <dependencies>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>5.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>5.1.0</version>
            </dependency>
            <!-- log4j is optional-->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.14.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.14.1</version>
            </dependency>
        </dependencies>
    

    Java 代码段:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Iterator;
    
    public class Demo1 {
    
        private static final Logger logger = LogManager.getLogger(Demo1.class);
    
        public static void main(String[] args) {
            try {
                File file = new File("File location");
                FileInputStream fis = new FileInputStream(file);
    
                XSSFWorkbook wb = new XSSFWorkbook(fis);
                XSSFSheet sheet = wb.getSheetAt(0);
    
                Iterator<Row> itr = sheet.iterator();
                logger.info("The given file is");
                while (itr.hasNext()) {
                    Row row = itr.next();
                    Iterator<Cell> cellIterator = row.cellIterator();
    
                    while (cellIterator.hasNext()) {
                        Cell cell = cellIterator.next();
                        switch (cell.getCellType()) {
                            case STRING:
                                logger.info(cell.getStringCellValue());
                                break;
                            case NUMERIC:
                                logger.info(cell.getNumericCellValue());
                                break;
                            default:
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      我遇到了同样的错误,请尝试将 XSSFWorkbook 声明更改为 HSSFWorkbook。它对我有用。

      【讨论】:

        【解决方案5】:

        对于以下错误“java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK”

        请执行以下任务:将 APACHE POI 3.** 升级到最新版本在我的情况下,我做了以下事情,我以前使用 apache poi 3.09,后来我将 lib 升级到最新版本,即 3.12 及其工作!!

        执行以下步骤,您的代码将会执行,但请确保错误应该相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多