【问题标题】:Troubleshooting with Export TableView to excel JavaFx使用导出 TableView 到 excel JavaFx 进行故障排除
【发布时间】:2022-01-13 23:04:17
【问题描述】:

最近我发现这个stackoverflow页面enter link description here“JavaFx:Export TableView to excel with name of columns”,我运行这段代码,我得到了以下问题

import org.apache.poi.ss.usermodel.Row;
                                  ^
TableViewExample.java:13: error: package org.apache.poi.ss.usermodel does not exist
import org.apache.poi.ss.usermodel.Sheet;
                                  ^
TableViewExample.java:14: error: package org.apache.poi.ss.usermodel does not exist
import org.apache.poi.ss.usermodel.Workbook;
                                  ^
TableViewExample.java:42: error: cannot find symbol
        Workbook workbook = new HSSFWorkbook();
        ^
  symbol:   class Workbook
  location: class TableViewExample
TableViewExample.java:43: error: cannot find symbol
        Sheet spreadsheet = workbook.createSheet("sample");
        ^
  symbol:   class Sheet
  location: class TableViewExample
TableViewExample.java:45: error: cannot find symbol
        Row row = spreadsheet.createRow(0);
        ^
  symbol:   class Row
  location: class TableViewExample
6 errors 

根据那里的描述,正在使用一个名为 Apache poi 的库。 我使用这个库来以这种方式运行这个代码 poi-3.0.2.jar

javac -classpath ".:poi-3.0.2.jar" TableViewExample.java

在 linux ubuntu 中使用命令行,我之前使用命令行编译了 archives.java,并取得了巨大的成功。 其他人使用过 jakarta-poi-3.0.2.jar 但这个 .jar 文件库不再存在,我改用 poi-3.0.2.jar。

现在我使用新的 poi-5.1.0.jar 并收到以下错误消息

library Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
    at TableViewExample.start(TableViewExample.java:42)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$10(GtkApplication.java:245)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 10 more

与“java.lang.ClassNotFoundException: org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream”相关

关于如何解决这个问题并使这段代码工作的任何信息?

提前谢谢你

【问题讨论】:

    标签: excel javafx command-line apache-poi


    【解决方案1】:

    最新的apache poi库是5.1.0,不推荐使用旧版本。 download is here,虽然我也不建议直接下载库,而是使用 maven 或 gradle 等构建工具将它们添加为依赖项。

    当您查看project file for poi 时,它有很多依赖项,因此仅将 poi jar 添加到类路径是不够的,相反,让您的构建工具解决它。

    现代 JavaFX 发行版(您应该使用)是模块化的,因此您需要为模块路径和添加的模块提供一个模块信息文件或命令行参数(您的示例中没有) .

    如果你有一个模块信息,那么你可能需要模块才能使 poi 工作(我不知道那个命令)。

    只要您在命令行上有正确的 JavaFX 模块规范(由非模块化应用程序的 openjfx.io getting started doc 定义),在没有模块信息的情况下运行可能会更容易。

    常见问题解答

    我现在正在考虑如何将 JavaFX 表格视图转换为 excel 的另一种解决方案

    我同意,不要使用 poi,而是将数据写入 csv 文件。您可以搜索有关如何使用 Java 以 csv 格式写入数据的解决方案。这就是我会做的。

    现在我实现了新的 poi 库 poi-5.1.0.jar 并收到了错误消息

    java.lang.ClassNotFoundException: org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream
    

    在执行期间,您仍然缺少运行应用程序所需的传递依赖项。

    如果你使用 poi,获取所需依赖项的一种方法是让 maven 将它们复制到 lib 目录:

    然后,当您执行您的应用程序 jar 时,将您的应用程序的 lib 目录放在您的类路径中,并将 JavaFX SDK lib 目录放在您的模块路径中。

    我可以创建 .csv 文件,但不幸的是客户要求 .xls 文件

    POI 可以直接创建 xls 文件,也可以运行外部工具进行 csv 到 xls 的转换:

    该工具可以包含在您的应用程序打包和安装中并从 java 调用:

    【讨论】:

    • 您好,非常感谢您的帮助,现在我实现了新的 poi 库 poi-5.1.0.jar,并且收到了上述与“java.lang.ClassNotFoundException: org”相关的错误消息.apache.commons.io.output.UnsynchronizedByteArrayOutputStream" 有关此问题的任何信息?我现在正在考虑如何将 JavaFX 表格视图转换为 Excel 的另一种解决方案,非常感谢您提前
    • 非常感谢您的帮助和支持,实际上我可以按照您的建议创建 Excel 可读的 .csv 档案,我发现有一种方法可以让 java 现在将 .csv 文件转换为 Excel 文件,非常感谢
    • @OmarElioTorresCastillo 如果您希望可以在 csv 解决方案中添加 self-answer
    • 请问,什么是自答???
    • 好的,我明白了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多