如何从Java代码调用Excel VBA宏?

如何从Java代码调用Excel VBA宏?,java,vba,excel,Java,Vba,Excel,我需要从通过Java从数据库中获取的数据生成Excel工作表。 为此,我需要在生成Excel时调用一些VBA宏函数。 有谁能帮我从Java代码中调用VBA宏吗?我不确定是否可以直接从Java调用宏。但是您可以在excel工作表中填充数据,并在用户第一次打开excel工作表时调用宏。您可以使用Apache POI工具在包含宏的excel工作表中填充数据-我不太了解您从数据库中的数据生成excel工作表的总体方法。通常,我会使用Vivek提出的ApachePOI 但是,如果确实需要在工作表中调用Ex

我需要从通过Java从数据库中获取的数据生成Excel工作表。 为此,我需要在生成Excel时调用一些VBA宏函数。
有谁能帮我从Java代码中调用VBA宏吗?

我不确定是否可以直接从Java调用宏。但是您可以在excel工作表中填充数据,并在用户第一次打开excel工作表时调用宏。您可以使用Apache POI工具在包含宏的excel工作表中填充数据-

我不太了解您从数据库中的数据生成excel工作表的总体方法。通常,我会使用Vivek提出的ApachePOI

但是,如果确实需要在工作表中调用Excel宏,则需要两件事:

首先,您需要一个类似JAVA到COM的桥接器或类似的工具。如果它支持自动化接口就足够了。它不需要有完整的COM支持

第二,使用JAVA-to-COM桥,您应该启动Excel,加载Excel工作表,运行宏,保存并关闭Excel。因此,您必须调用等效的:

Set Wb = Application.Workbooks.Open FileName
Application.Run MacroName
Wb.Save
Application.Quit

当工作表发生更改时,您还可以在excel中捕获事件您可以调用任意宏,因此如果要调用宏“Blue”,您可以在隐藏的工作表中写入“Blue”,excel将捕获更改,捕获更改后,您可以查看编写的内容,并执行一些if-if-else语句,以获取要为该实例调用的宏。不是很好的编码,但是一个简单的解决方法。不过,我会自己做其他方法。

如果您不能使用
JACOB
COM4J
,您可以制作一个Visual Basic脚本并从Java程序运行该脚本

要创建脚本,请打开记事本并编写如下内容:

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("myExcel.xlsm")

objExcel.Application.Run "myExcel.xlsm!MyMacroName" 
objExcel.ActiveWorkbook.Close

objExcel.Application.Quit
WScript.Quit
将其另存为
myVBS.vbs
,您可以从Java代码中这样调用它:

cmd = "you_path\\myVBS.vbs";
Runtime.getRuntime().exec(cmd);

适合我的解决方案: java代码:

try {
Runtime.getRuntime().exec("wscript yourPth\\myVBS.vbs");
} catch (IOException e) {
System.out.println(e);
System.exit(0);
}
myVBS.vbs脚本:

Set objShell = CreateObject("WScript.Shell")
Dim cur
cur = "urpath to myVBS.vbs script"
WScript.Echo cur

ExcelMacroExample

Sub ExcelMacroExample() 

Dim xlApp 
Dim xlBook 
Dim xlsFile
xlsFile = cur & "\myExcel.xlsm"

Set xlApp = CreateObject("Excel.Application") 
Set xlBook = xlApp.Workbooks.Open(xlsFile) 
xlApp.Run "moduleName"
xlApp.Save
xlApp.Quit 

End Sub 

相关的谢谢你的回复,先生。实际上,我们已经设计了一个excel模板。我想用java来填充这个模板。在填充模板时,我们需要调用一些宏函数来处理写入的数据。我们目前正在使用Jetcel读取excel。但我们不知道可以从中调用宏。那么您知道jxl可以用于此目的吗?JExcel类似于apachepoi。它是一个独立于平台的库,用于在不使用Excel本身的情况下读取和写入Excel文件。不能使用它运行宏。但是,JExcel能够打开现有的Excel文件(您的模板),向其中添加数据并进行各种格式化。因此,我建议您使用JExcel实现宏的功能。如果您需要在非Windows平台或服务器环境(例如web应用程序)中运行它,您无论如何都不能运行Excel宏,因为Excel只支持Windows和单用户环境。感谢Codo,我们目前正在使用Jetcel,我们也认为我们应该使用它,而不是在项目中引入新的API。是的,我们将进行必要的编码,因为我们仍然无法找到如何从java调用宏。因此,我们这样做只是为了通过JExcel格式化和更改相关内容。再次感谢你。谢谢你的回答,乔恩,我们也可以这样做。但这是一个乏味的过程。目前,我们在工作簿中有大约10张充满宏的工作表。因此,插入一个新的宏并维护它是一项艰巨的工作。这不是我的方式,但它会工作,我会设置一个事件处理程序类,这样你就不必把它放在每个工作表上。宏中的事件处理程序“类”??怎么做??(事件概述)和(特定应用程序事件)