首页 > 解决方案 > java.lang.NoSuchFieldError:默认

问题描述

我目前正在使用vscode和apache poi,创建了一个程序来自动创建.xlsx程序并让A1单元格输入一个名为“Tester”的字符串,然后弹出该错误。

我的程序中的代码:

package excel_reader;

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelWriter {
    public static void main (String[] args) throws Exception {
        //ExcelReader eR = new ExcelReader();
        XSSFWorkbook workbook = new XSSFWorkbook();  // here is the7 line 13
        // first sheet create
        XSSFSheet sheet = workbook.createSheet("FirstExcelSheet");
        // first row create - A
        XSSFRow row = sheet.createRow(0);
        // first cell create - 1
        XSSFCell cell = row.createCell(0); // A-1
        // give data into A-1 cell
        cell.setCellValue("Tester");

        // Output as an excel file
        workbook.write(new FileOutputStream("C:\\Users\\Sonic\\Desktop\\book.xlsx"));
        workbook.close();

        // C:\\Users\\Sonic\\Desktop\\book.xlsx
    }
}

错误代码:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell aka.ms/pscore6

PS E:\excel_reader_v.1_beta1-0> cd 'e:\excel_reader_v.1_beta1-0'; & 'C:\Users\Sonic\.vscode\extensions\vscjava.vscode-java-debug-0.24.0\scripts\launcher.bat' 'C:\Users\Sonic\AppData\Local\Programs\AdoptOpenJDK\bin\java' '-Dfile.encoding=UTF-8' '-cp' 'C:\Users\Sonic\AppData\Local\Temp\cp_5wuvlu562pjj6rfd2pconxvl4.jar' 'excel_reader.ExcelWriter' 
Exception in thread "main" java.lang.NoSuchFieldError: DEFAULT
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:161)
        at excel_reader.ExcelWriter.main(ExcelWriter.java:13)

pom.xml ( dependency):

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.1</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.11</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.1</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>3.1.0</version>
</dependency>

Apache POI 对我来说是新手,请帮帮我,我将不胜感激,非常感谢。

标签: javaapache-poi

解决方案


原因java.lang.NoSuchFieldError

如果你在StackOverflow 上搜索标签,你会发现很多类似的问题。他们中的大多数人有两个共同点:

  • 该错误表示找不到CONSTANT字段
  • 原因是相关的 2 个或多个依赖项(即第三方 JAR 文件)具有不同的版本

版本不匹配也可能导致您的错误:

java.lang.NoSuchFieldError:默认

DEFAULT由于class的常量org.apache.poi.ss.formula.udf.UDFFinder存在于 3.17 之前的版本中,但现在(4.0 和更新的版本)已被弃用。意味着,它在 4.0及更高版本中不存在。

运行时问题: 如果语句new XSSFWorkbook();(在第 13 行)使用依赖项 (JAR) 执行poi-ooxml,则它使用UDFFinder核心依赖项 (JAR)poi并因此尝试查找 CONSTANT 字段DEFAULT(可能不存在,因为版本不匹配)。

所以我想,你的 Apache 版本poipoi-ooxml不匹配(不是同一级别)。使用 Apache Poi查看版本不匹配类似的问题。

解决方案:匹配版本!

如果您使用的是Maven,请确保您的 POM 上有这些依赖项:

    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
    </dependencies>

至少两者必须是相同的版本

如果您手动管理类路径和 JAR,请注意所有 apache-poi JAR 文件的文件名并确保版本相同。

代码似乎非常接近工作

如果您只想将新创建的 Excel-Workbook 写入文件,例如/tmp/MyFirstExcel.xlsx(在 Linux 上)或C:/Users/Sonic/MyFirstExcel.xlsx(在 Windows 上,假设您的 Windows-User 是Sonic),请使用以下代码:

public class ExcelWriter {
    static final String FILE_PATH_LINUX = "/tmp/MyFirstExcel.xlsx";
    static final String FILE_PATH_WIN = "C:/Users/Sonic/MyFirstExcel.xlsx"; // note: replace Window's backslash '\' by either double-backslash '\\' or single forward-slash '/'

    public static void main(String[] args) throws FileNotFoundException, IOException {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("FirstExcelSheet"); // first sheet create
        XSSFRow row = sheet.createRow(0); // first row create - A
        XSSFCell cell = row.createCell(0); // first cell create - A-1        
        cell.setCellValue("Tester"); // give data into A-1 cell

        // Output as an excel file
        workbook.write(new FileOutputStream(FILE_PATH_WIN));
        workbook.close();
    }
}

类的用法不明确ExcelReader 没有明显的理由从ExcelReader. 因此,为简单起见,您可以省略extends ExcelReader、 声明ExcelReader eR = new ExcelReader();和使用eR.getImpoFileLink()来获取文件路径。否则,请将类的源代码发布ExcelReader到您的问题中,以使其成为最小的可重复示例

最小的工作解决方案(上图)解释: 相反,只需将文件路径放置到所需的文件夹和文件,就像FILE_PATH_WIN这里的常量一样。几个小时前我看到了你的相关问题,你在哪里做的。

假设您在此处修复了其他问题/问题,并在此处解决了与 POI 依赖项的版本不匹配,则上面给出的解决方案应编译并写出所需的 Excel 工作簿 (.xlsx),其中包含包含字符串的工作表FirstExcelSheet和单元格。A1Tester

也可以看看

请参阅有关 Apache POI 的本教程- 在 Java 中读取和编写 Excel 文件


推荐阅读