Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java调用VBA代码_Java_Vba_Dll_Netbeans_Excel - Fatal编程技术网

从Java调用VBA代码

从Java调用VBA代码,java,vba,dll,netbeans,excel,Java,Vba,Dll,Netbeans,Excel,您好,先生 我在更大的互联网上搜索过,被无数浪费的帖子或解释与我尝试的完全相反顺序的答案所困扰 我有一个Excel文件,其中包含大量VBA代码。在Excel中打开文档时,有4个公共子例程不接受用户可以调用的参数,它们根据需要操作各种工作表中的数据。我们有一个大型Java应用程序,希望通过调用Java环境中的宏与本文档交互。关键是我们只需要编写一次VBA代码,然后Java就可以调用它来执行。此外,我们希望假设Java应用程序的用户不一定能够立即访问Excel,而是在Windows机器上操作。一个人

您好,先生

我在更大的互联网上搜索过,被无数浪费的帖子或解释与我尝试的完全相反顺序的答案所困扰

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

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

请注意,作为我在其他地方的问题的最常见答案,我非常清楚如何从VBA中调用Java,而不是从Java调用VBA


提前谢谢。

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

  • Java COM桥接器:有几种工具允许您从Java调用COM或COM自动化组件。Excel就是这样一个组件。我知道和,但可能有更多这样的工具可用

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

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

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

    不能将VBA代码编译到DLL中。没有用于此的工具(与完整的Visual Basic相反)


    我希望这个答案是有帮助的,尽管我不理解你的意思:“我们想假设Java应用程序的用户不一定能够立即访问Excel,而是在Windows机器上操作。”

    只是澄清一下,它是本地(客户端)Java应用程序?是的,Excel文档是Java程序的本地文档,Java程序完全是客户端的。你看了吗?VBScript和VBA不是一回事,所以我不敢说这是最终的解决方案。此外,它还要求用户在其计算机上安装Excel。这是我们可以灵活处理的事情,但我们宁愿不需要它。不在客户机上安装Office套件就可以完成吗?我们可以让它创建DLL,但不希望强制使用它。因此,您的数据在Excel中,您希望调用文档中的Excel宏来处理数据,但不希望要求在客户端上安装Excel。我看不出这是怎么回事:即使您已经知道如何从Java调用VBA,如果没有Excel,那么这似乎有点困难……听起来是一个很好的开始,谢谢。我想我会这样做:创建一个复制现有VBA的COM对象。然后,创建一个调用COM函数的dll,让Java加载dll,并调用其函数。请澄清我的引用:我们假设客户端位于Windows计算机上,但没有安装office套件(包括Excel)。因此,如果它需要打开Excel才能这样做,这不是一个可行的解决方案。。。您计划如何在未安装Excel的情况下运行VBA代码?为什么你要写一个COM对象(不管用什么语言?),然后写一个包装器(C++或其他什么),最后,如果你必须重写VBA代码,最后调用java。为什么不把它简化很多倍并用Java重写呢?不幸的是,这不是一个好的答案,因为没有好的答案。Jacob和提供的其他COM选项制作得很差,根本无法实现java和MS工具之间的良好集成。
    Dim xl
    Set xl = CreateObject("Excel.Application")
    xl.Workbooks.Open ("workbook.xlsx")
    xl.Application.Run "MyMacro"
    xl.Application.Quit
    Set xl = Nothing