这篇文章回答了OP的问题:
否则,我们可以从Java代码运行PowerPoint的宏吗?请帮忙!
(但不涉及原始vbscript问题)
有一个名为JACOB库的东西,它代表Java COM Bridge,您可以在此处找到:
http://sourceforge.net/projects/jacob-project/?source=directory
使用它,您可以调用Excel、Word、Outlook、PowerPoint应用程序对象模型方法。
我已经尝试过Excel,但没有尝试过PowerPoint。(这只是一些示例代码,可能需要使其更面向对象。)
public class Excel {
private static ActiveXComponent xl = null;
public static Init() {
try {
ComThread.InitSTA();
xl = ActiveXComponent.connectToActiveInstance("Excel.Application.14");
if (xl==null) {
xl = new ActiveXComponent("Excel.Application");
Dispatch.put(xl, "Visible", Constants.kTrue);
}
}
catch (Exception e) {
ComThread.Release();
}
}
public static String Run(String vbName) {
Variant v = Dispatch.call(xl, 0x103, vbName);
return v.getString();
}
public static Variant Run1p(String vbName, Object param) {
return Dispatch.call(xl, 0x103, vbName, param);
}
public static Worksheet GetActiveWorksheet () {
Dispatch d = Dispatch.get(xl, 0x133).toDispatch ();
return d;
}
}
注意:
对于Excel,要想通过Run调用VBA宏/子程序,必须满足以下几个条件:
- 包含宏的Excel工作簿必须是“活动的”(即必须是ActiveWorkbook),否则Run将无法找到VBA子例程。(但是工作簿不必可见屏幕!这意味着您可以调用位于插件中的VBA宏!)
- 然后,您可以使用以下语法将宏的名称作为字符串文字传递:
VBAProjectName.VBAModuleName.SubroutineName
对于COM对象调用,您可以使用名称查找版本或ID号版本。 ID号来自已发布的COM接口(您可以在C++头文件中找到它们,或者可能让JACOB为您查找)。
如果您成功连接到Excel,请确保在完成后调用ComThread.Release()。将其放置在适当的finally语句中。如果您的Java代码进程在不调用它的情况下终止,则Excel上的COM引用计数将是错误的,并且即使在退出Excel应用程序后,Excel进程也永远不会终止。一旦发生这种情况,毫无疑问,Excel开始表现得很奇怪(当您尝试下次使用它时,它会运行但无法加载任何插件/附加组件)。如果发生这种情况(特别是在绕过finally语句以进行更好的调试时),则必须使用任务管理器来终止Excel进程。