excel - 使用 Apache POI 打开 .xlsx 文件会给出 NoClassDefFoundError InvalidFormatException

标签 excel ubuntu apache-poi noclassdeffounderror

我无法正常导入所有必需的 .jar 文件。
我的最终目标只是读取一个 Excel 电子表格(更具体地说是 .xlsx 文件),以检查 Apache POI 的速度是否适用于 future 的应用程序。

我的问题是为什么我会被抛出错误......

java.lang.NoClassDefFoundError: org/apache/poi/openxml4j/exceptions/InvalidFormatException



...当我可以在“文件 poi-ooxml-3.9-20121203.jar”的/org/apache/poi/openxml4j/exceptions/的类 InvalidFormatException 中看到?

我已经有一段时间没有用 Java 编程了,我希望我自己的理智,我犯了一个愚蠢的错误。我的代码似乎编译正确,但是当我尝试运行程序时出现上述错误消息。我已经对我的问题进行了一些研究,但无法找到我的情况。他们通常只是忘记/没有所需的 .jar 文件。也许我在同一条船上,但希望你能告诉我。

我将分解我的逻辑。这是 TestExcel.java 中的代码
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

public class TestExcel 
{
    public static void main(String[] args) 
    { 
        InputStream inp; 
        try 
        { 
            inp = new FileInputStream("cost.xlsx"); 

            Workbook wb; 
            try { 
                wb = WorkbookFactory.create(inp); 
            } 
            catch (FileNotFoundException e) { 
                e.printStackTrace(); 
            } 
        } 
        catch (InvalidFormatException e) { 
            e.printStackTrace(); 
        } 
        catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

这是用于编译和运行 java 代码的文件“c_test”:
javac -classpath "/home/robsco/Webdev/java/poi/*" TestExcel.java
java TestExcel

这是上面类路径的目录列表:
robsco@roblaptop:~/Webdev/java/poi$ ls -al
total 26616
drwxrwxr-x 2 robsco robsco     4096 Aug 18 18:13 .
drwxrwxr-x 6 robsco robsco     4096 Aug 18 18:12 ..
-rwxr-xr-- 1 robsco robsco    52915 Sep 18  2009 commons-logging-1.1.jar
-rwxr-xr-- 1 robsco robsco   313898 Apr  5  2009 dom4j-1.6.1.jar
-rwxr-xr-- 1 robsco robsco   121070 Apr  5  2009 junit-3.8.1.jar
-rwxr-xr-- 1 robsco robsco   358180 Apr  5  2009 log4j-1.2.13.jar
-rwxrw-r-- 1 robsco robsco 14841622 Aug 18 13:15 ooxml-schemas-1.1.jar
-rwxr-xr-- 1 robsco robsco  1869113 Nov 26  2012 poi-3.9-20121203.jar
-rwxr-xr-- 1 robsco robsco    30446 Nov 26  2012 poi-excelant-3.9-20121203.jar
-rwxr-xr-- 1 robsco robsco   936648 Nov 26  2012 poi-ooxml-3.9-20121203.jar
-rwxr-xr-- 1 robsco robsco  4802621 Nov 26  2012 poi-ooxml-schemas-3.9-20121203.jar
-rwxr-xr-- 1 robsco robsco  1226511 Nov 26  2012 poi-scratchpad-3.9-20121203.jar
-rwxr-xr-- 1 robsco robsco  2666695 Apr  5  2009 xmlbeans-2.3.0.jar

和执行'c_test'的输出:
robsco@roblaptop:~/Webdev/java$ ./c_test 
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/openxml4j/exceptions/InvalidFormatException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
    at java.lang.Class.getMethod0(Class.java:2764)
    at java.lang.Class.getMethod(Class.java:1653)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.openxml4j.exceptions.InvalidFormatException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more

我在用:
操作系统:Lubuntu 12.10 x86
java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)

robsco@roblaptop:~/Webdev/java/poi$ javac -version
javac 1.7.0_25

最佳答案

问题在于您如何启动程序。我看到你目前有一个 shell 脚本:

javac -classpath "/home/robsco/Webdev/java/poi/*" TestExcel.java
java TestExcel

它可以与所有 jar 一起编译,但不能与它们一起运行,因此您的程序将没有可用的依赖项。 (与某些 c 程序不同,使用 Java 编译不会内联依赖关系,也不会添加文件的本地链接。如果您真的需要它,有一些工具可以为您做到这一点)

如果您将 shell 脚本更改为:
javac -classpath "/home/robsco/Webdev/java/poi/*" TestExcel.java
java -classpath ".:/home/robsco/Webdev/java/poi/*" TestExcel

它应该可以正常工作。请注意在类路径中添加当前目录,以便“java”找到您的类(在本例中为 TestExcel)。

或者,您可以使用 CLASSPATH 对环境变量进行一些处理。 Java 检查的环境变量,例如
export CLASSPATH=.:`ls -1d --color=no /home/robsco/Webdev/java/poi/* | xargs echo | sed 's/ /\:/g'`
javac TestExcel.java
java TestExcel

关于excel - 使用 Apache POI 打开 .xlsx 文件会给出 NoClassDefFoundError InvalidFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301358/

相关文章:

java - 使用 Apache POI 生成 Excel

mysql - 得到 ??从 excel 表中获取汉字并通过 vba 导出到 mysql 时

java - 该进程无法访问该文件,因为它正被另一个进程使用

macos - Bash 变量字符替换以空字符串或无效命令结束

当系统日期/时间更改为过去的一天/时间时,JavaFX 卡住

mysql - 如何远程连接到在基于 Vagrant 的 Ubuntu 16.04 虚拟服务器上运行的 MySQL?

excel - 如何在 Apache POI XSSF 4.10 中将单元格类型设置为字符串?

java - 从 Excel 文件读取数字 - Java - Swing

excel - 查找文本位于哪列?

excel - VBA 上的 lvwReport 到底是什么?