【问题标题】:How do I call VBA code in an Excel spreadsheet from Java?如何从 Java 调用 Excel 电子表格中的 VBA 代码?
【发布时间】:2011-10-13 14:21:47
【问题描述】:

我有一个包含大量 VBA 代码的 Excel 文件。当在 Excel 中打开文档时,有 4 个不带参数的公共子例程可以由用户调用,这些子例程根据需要处理各种工作表中的数据。我们有一个大型 Java 应用程序,我们希望通过从 Java 环境调用宏来与此文档进行交互。关键是我们只需要编写一次 VBA 代码,然后 Java 就可以调用它来执行。此外,我们想假设 Java 应用程序的用户不一定能够立即访问 Excel,而是在 Windows 机器上操作。应该怎么做呢?

我们是否将 VBA 代码编译成 DLL,然后在 Java 中调用它?您如何编译 DLL,是否需要使用 Visual Studio?我们如何从 Java 中调用 DLL?我们应该尝试某种 COM 对象吗?

【问题讨论】:

  • 澄清一下,它是一个本地(客户端)Java 应用程序?
  • 是的,Excel文档是Java程序本地的,Java程序完全是客户端的。
  • 你看到这个stackoverflow.com/questions/2805763/…了吗?
  • VBScript 和 VBA 不是一回事,所以我不敢说这是最终的解决方案。此外,它还要求用户在他们的机器上安装 Excel。这是我们很灵活的事情,但宁愿不需要它。是否可以在不在客户端计算机上安装 Office 套件的情况下做到这一点?我们可以使用它来创建 DLL,但宁愿不强制使用它。
  • 所以你的数据在Excel中,你想在文档中调用Excel宏来处理数据,但是你不想要求在客户端安装Excel。我看不出它是如何工作的:即使你已经知道如何从 Java 调用 VBA,如果没有 Excel,那似乎有点障碍......

标签: java vba dll netbeans excel


【解决方案1】:

我基本上看到了从 Java 应用程序调用 Excel 中的 VBA 代码的三个选项:

  1. Java COM Bridge:有多种工具可让您从 Java 调用 COM 或 COM 自动化组件。 Excel就是这样一个组件。我知道JacobJCom,但可能会有更多这样的工具可用。

  2. Java / VBScript / COM 自动化:由于您显然不需要将数据传递给 VBA 代码,因此最简单的解决方案可能是编写一个启动 Excel 的 VBScript,打开文档,调用宏并关闭 Excel。此脚本从 Java 启动,Runtime.getRuntime().exec("cmd /c start script.vbs");

  3. JNI:您可以为您的应用程序编写一个特定的 DLL。它实现了 JNI 接口,因此可以从 Java 中调用它。它的实现使用 COM 调用来处理 Excel。这样的 DLL 最好用 VisualStudio 编写,它支持 C++ 调用 COM 对象。

无论您的解决方案是什么,您基本上都希望在 Excel 自动化界面(VBScript 中的示例)上执行以下命令:

Dim xl
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open ("workbook.xlsx")
xl.Application.Run "MyMacro"
xl.Application.Quit
Set xl = Nothing 

您不能将 VBA 代码编译成 DLL。不存在这样的工具(与完整的 Visual Basic 相比)。

我希望这个答案对您有所帮助,即使我不明白您的意思:“我们想假设 Java 应用程序的用户不一定能够立即访问 Excel,而是在Windows 机器。”

【讨论】:

  • 听起来不错,谢谢。我想我会这样做:创建一个复制现有 VBA 的 COM 对象。然后,创建一个调用 COM 函数的 dll,并让 Java 加载该 dll,并调用它的函数。
  • 澄清您的报价:我们假设客户端在 Windows 机器上,但没有安装任何办公套件(包括 Excel)。因此,如果需要打开 Excel 才能这样做,这不是一个可行的解决方案。
  • 现在我很困惑......你打算如何在没有安装 Excel 的情况下运行 VBA 代码?为什么要编写一个 COM 对象(无论如何都用什么语言?),然后是一个包装器(用 C++ 或其他什么语言),如果无论如何都必须重写 VBA 代码,最后从 Java 调用它?为什么不把它简化很多倍,然后用 Java 重写呢?
  • 不幸的是,这并不是一个好的答案,因为没有好的答案。 Jacob 和提供的其他 COM 选项做得很差,根本无法在 java 和 MS 工具之间实现良好的集成。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2017-07-22
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多