NoSuchFieldError при чтении листа Excel в Java
Я следовал простому руководству по созданию рабочей книги с использованием 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();
}
Ошибка вывода:
Исключение в потоке "main": java.lang.NoSuchFieldError: RAW_XML_FILE_HEADER в org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:179) в org.apache.perjop.op.in.op.op.in.op.op.in.op.j.op.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)
5 ответов
Осмотревшись немного. Я просмотрел документацию по APACHE POI и увидел, что это была одна из констант (не то, чтобы я знал, что это на самом деле означает). Но в конце концов я понял, что все учебные пособия, которые я использовал, были до 2014 года, поэтому я просто изменил свой Maven POM на версию 3.11 Apache POI и POI-OOXML. Теперь это работает.
Я получил ту же ошибку с другой константой.
Исключение в потоке "main" java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK poi.
Погуглил много но ответа нет. Я использовал apache poi-ooxml-3.11, позже я перешел на 3.17, затем он работал нормально.
Надеюсь, это кому-нибудь пригодится.
В случае, если кто-то работает с последней библиотекой 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();
}
}
}
Я получил ту же ошибку, попробуйте изменить объявление XSSFWorkbook на HSSFWorkbook. Это сработало для меня.
Для следующей ошибки "java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK"
Пожалуйста, выполните следующую задачу: обновите APACHE POI 3.** до последней версии, в моем случае я сделал следующее, я ранее использовал apache poi 3.09, позже я обновил lib до последней версии, то есть 3.12, и его работа!!
Выполните следующие шаги, и ваш код будет, но убедитесь, что ошибка должна быть такой же.