我目前正在使用 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
}
}
Run Code Online (Sandbox Code Playgroud)
错误代码:
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)
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
Apache POI 对我来说是新手,请帮助我,我将不胜感激,非常感谢。
java.lang.NoSuchFieldError如果你在StackOverflow 上搜索 tag nosuchfieldexception,你会发现很多类似的问题。他们中的大多数有两个共同点:
此版本不匹配也可能导致您的错误:
java.lang.NoSuchFieldError: DEFAULT
由于DEFAULTclass的常量org.apache.poi.ss.formula.udf.UDFFinder存在于 3.17 之前的版本中,但现在(版本 4.0 和更高版本)已被弃用。意味着,它在 4.0及以上版本中不存在。
运行时问题:
如果语句new XSSFWorkbook();(在第 13 行)是使用依赖项 (JAR) 执行的poi-ooxml,那么它使用UDFFinder核心依赖项 (JAR) 的 apoi并因此尝试找到 CONSTANT 字段DEFAULT(它可能不存在,因为版本不匹配)。
所以我想,你的 Apachepoi和版本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>
Run Code Online (Sandbox Code Playgroud)
至少两者必须是相同的版本!
如果您手动管理类路径和 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();
}
}
Run Code Online (Sandbox Code Playgroud)
类的不明确用法ExcelReader:
没有明显的理由从ExcelReader. 因此,为了简单起见,您可以省略extends ExcelReader, 声明ExcelReader eR = new ExcelReader();和用法eR.getImpoFileLink()来获取文件路径。否则,请将类的源代码发布ExcelReader到您的问题中,以使其成为最小的可重现示例。
最小工作解决方案(以上)解释:
而不是将文件路径放在所需的文件夹和文件中,就像FILE_PATH_WIN这里的常量一样。几个小时前我看到了你的相关问题,你在哪里做的。
假设您在此处解决了其他问题/问题,并在此处解决了与 POI 依赖项的版本不匹配问题,则上面给出的解决方案应编译并写出所需的 Excel 工作簿 (.xlsx),其中包含包含 string 的工作表FirstExcelSheet和单元格。A1Tester
请参阅有关Apache POI – 使用 Java 读取和编写 Excel 文件的本教程。