9

我想阅读excel文件但给

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject
 at ExcelReader.main(ExcelReader.java:32)
Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlObject
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more

请帮我。首先打开 .xlsx 文件,然后给出第一张纸。最后在控制台上打印excel文件的数据。Ps:我将 poi-ooxml-3.9-20121203.jar 添加到我的项目中。

    import java.io.File;
    import java.io.FileInputStream;
    import javax.swing.text.html.HTMLDocument.Iterator;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import java.util.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    /**
     * @author mohammad hosein
    *
    */
    public class ExcelReader {

/**
 * @param args
 */
public static void main(String[] args) {
    try
    {
    FileInputStream file = new FileInputStream(new File("E:\\test.xlsx"));

    //Get the workbook instance for XLS file 
    XSSFWorkbook workbook = new XSSFWorkbook (file);

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

    //Get iterator to all the rows in current sheet
    java.util.Iterator<Row> rowIterator = sheet.iterator();

    while(rowIterator.hasNext())
    {
        Row row = rowIterator.next();
        java.util.Iterator<Cell> cellIterator = row.cellIterator();

        while(cellIterator.hasNext())
        {
            Cell cell = cellIterator.next();
            System.out.print(cell.getStringCellValue() + "\t");
        }
        System.out.println("");
    }
    }
    catch(Exception e)
    {
        System.out.println("EROR!");
    }

    //Get iterator to all cells of current row

}

}

4

12 回答 12

14

您的代码无关紧要。NoClassDefFoundError当编译时可用的类在运行时不可用时发生。如果您提供了完整的堆栈跟踪以及尚未找到的类的实际名称,则可以给出更准确的建议。

通常,当您使用与用于构建代码的 JAR 版本不同的 JAR 版本运行代码时,就会发生这种情况。恶意 JAR 可能来自应用程序容器或类似容器,并且比您的正确 JAR 更早地放置在类路径中。

更新

鉴于您添加的堆栈跟踪,您缺少 Apache POI 的传递依赖项:XMLBeans。您可能在运行时缺少此 JAR。这一切都取决于您运行项目的准确程度。

于 2013-09-20T12:07:13.370 回答
5

我认为您忘记检查项目属性中的库。

  1. 右键单击您的项目->选择属性
  2. 选择 Java 构建路径
  3. 选择选项卡对象并导出
  4. 然后选择您添加的库。
  5. 好的,然后再次运行您的项目。
于 2013-09-20T12:09:29.600 回答
4

当没有添加所有必需的 poi jar 文件时会发生这种情况。所以我的建议是添加所有必需的 jar 文件。在 lib 和 ooxml-lib 文件夹中添加 jar 文件以及 poi-3.15-beta2 jar 文件。如何添加罐子

  1. 右键单击项目
  2. 构建路径>配置构建路径
  3. 库选项卡
  4. 添加外部jar文件
于 2016-09-24T06:51:33.217 回答
1

Apache POI 文档提供了不同组件及其依赖项的完整列表。你声明你想使用poi-ooxml,但你似乎错过了xmlbeans依赖(也许还有其他人!)。有关一切所需的全部详细信息,请参阅组件页面。

如果您下载Apache POI 的二进制版本,那么您会发现软件包中包含您可能需要的所有依赖项。只需添加您需要的。

如果所有这些手动操作对您来说有点困难,请使用Apache MavenApache Ivy之类的工具来为您管理依赖项。

接下来,您需要所有这些罐子可用两次。一次编译,一次运行。仅仅在 eclipse 或类似的环境中使用 jars 可能还不够,您还需要将它们放入您的生产环境中!

于 2013-09-20T14:11:07.523 回答
1

确保在库中添加了“commons-collections.jar”文件,否则从此处下载所有库文件:

http://www-us.apache.org/dist/poi/release/bin/poi-bin-3.16-20170419.zip

在 zip 文件中下载后打开“lib”文件夹,您将找到需要添加到项目库中的 common-collectins.jar 文件,如附图所示:

图像显示了所有必要的库

于 2017-05-19T11:43:00.843 回答
0

NoClassDefFoundError如果在编译期间存在类但在运行期间在 java 类路径中不可用,则会出现。通常,当您收到 NoClassDefFoundError 时,您会在日志中看到以下行:

本网站为您提供了为什么会出现此错误的所有原因 3 种解决方法

于 2013-09-20T12:08:59.487 回答
0

顾名思义,ClassNotFoundExceptionJava 是Java 虚拟机尝试加载特定类但在类路径中找不到请求的类时的子类。java.lang.Exception

关于此异常的另一个重要点是,它是一个检查异常,您需要在使用可能ClassNotFoundException通过使用 try-catch 块或使用 throws 子句在 java 中抛出的方法时提供显式异常处理。

甲骨文文档

public class ClassNotFoundException
 extends ReflectiveOperationException

当应用程序尝试通过其字符串名称加载类时抛出:

  • Class 类中的 forName 方法。
  • ClassLoader 类中的 findSystemClass 方法。
  • ClassLoader 类中的 loadClass 方法。

但找不到具有指定名称的类的定义。

poi-ooxml-schemas-3.9-20121203.jar文件添加到类路径以避免异常。
您将在这些链接上找到

  1. 阿帕奇
  2. 得到罐子

编辑

您缺少 POI 附带的额外 jar 文件。将它们包含在您的类路径中。
您需要在xmlbeans-x.x.x.jar 此处包含一个名为 get jar的 jar 文件。
XMLBeans

于 2013-09-20T12:11:20.950 回答
0

一般 NoClassDefFoundError exception会发生,当需要的jar不可用时,

检查以下条件

  1. 检查Jar file path您添加的默认情况下 poi-ooxml-3.9-20121203.jar
  2. 完全检查是否需要任何额外的 jar,在编译时程序可能需要您尚未导入的任何类文件

  3. poi-3.7-jdk1.4-20110508-rc2jar 是必需的。

于 2013-09-20T12:13:08.670 回答
0

poi-3.9 附带了 2 个重要的 jar 文件,当 XSSFWorkbook 使用它们时需要包含它们

xmlbeans*.jar dom4j-*.jar

这两个 jar 文件都存在于 ooxml-lib 文件夹中,并且是 poi-3.9*.zip 的一部分。将它们包含在您的库中,这应该可以解决问题。

于 2013-10-11T04:06:23.827 回答
0

我只是有同样的问题。我通过将整个文件夹添加到库(使用 Netbeans)在 \ooxml-lib\ 文件夹中添加了 JAR。我删除了这个并手动添加了每个,它工作。

于 2014-03-19T15:31:38.440 回答
0

在构建路径中添加 xmlbeans-2.3.0.jar。它是 xlsx 所必需的。

于 2014-07-23T07:51:06.117 回答
0

至于我可以检查有关此问题的任何评论,我达到了使我的代码运行没有任何“java.lang.NoClassDefFoundError”错误的步骤:

  1. 手动将下面的库添加到您的类路径中:

    poi-ooxml-full-5.2.0.jar

    poi-ooxml-schemas-3.15.0.jar

  2. 为您添加依赖项pom.xml

    poi (5.1.0) from (org.apache.poi)

    poi-ooxml (5.1.0) from (org.apache.poi)

    log4j-core (2.16.0) from (org.apache.logging.log4j)

    log4j-api (2.17.1) from (org.apache.logging.log4j)

我在 Intellij IDEA 2021 下包含了对我正常工作的版本。

于 2022-02-05T11:51:40.927 回答