java - 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 对我来说是新手,请帮帮我,我将不胜感激,非常感谢。
解决方案
原因java.lang.NoSuchFieldError
如果你在StackOverflow 上搜索标签nosuchfieldexception,你会发现很多类似的问题。他们中的大多数人有两个共同点:
此版本不匹配也可能导致您的错误:
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 版本poi
和poi-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
和单元格。A1
Tester
也可以看看
请参阅有关 Apache POI 的本教程- 在 Java 中读取和编写 Excel 文件。
推荐阅读
- typescript - 使用 Typescript 从过滤器中获取强类型
- azure-data-explorer - azure 数据资源管理器 (kusto) 中的行到列
- c++ - constexpr 编译器行为不一致
- android - react native gif 在 android 上不起作用,添加了 android/app/build.gradle 行来支持 gif
- hash - c ++ libtomcrypt库输出较短的散列/截断的散列
- node.js - 安装 NPM 包时遇到错误
- node.js - 如何将画布对象转换为图像以作为 API 响应发送?
- javascript - 我想删除数字,但显示错误
- three.js - AddEquation 的奇怪效果
- graphql - 为什么我的 graphql 查询返回所有产品?