这篇文章回答了OP的问题:
否则我们可以从java代码运行power point的宏......请帮助!
(但没有解决原来的 vbscript 问题)
有代表 Java COM Bridge 的 JACOB 库,你可以在这里找到: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");
// 14 is Office 2010, if you don't know what version you can do "Excel.Application"
if (xl==null) {
// code to launch Excel if not running:
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, "Run", vbName); // using string name lookup
Variant v = Dispatch.call(xl, 0x103, vbName); // using COM offset
// return Dispatch.get(this, "Name").getString();
return v.getString();
}
public static Variant Run1p(String vbName, Object param) {
// Variant v = Dispatch.call(xl, "Run", vbName, param);
return Dispatch.call(xl, 0x103, vbName, param);
// return Dispatch.get(this, "Name").getString();
}
public static Worksheet GetActiveWorksheet () {
// Dispatch d = xl.getProperty("ActiveSheet").toDispatch();
Dispatch d = Dispatch.get(xl, 0x133).toDispatch ();
return d; // you may want to put a wrapper around this...
}
}
笔记:
至少对于 Excel,要让 Run 调用 VBA 宏/子例程,必须满足以下条件:
- 包含宏的 Excel 工作簿必须是“Active”(即必须是 ActiveWorkbook),否则 Run 将找不到 VBA 子例程。(但是工作簿不必在屏幕上可见!!这意味着您可以调用加载项中的 VBA 宏!)。
- 然后,您可以使用以下语法将宏的名称作为字符串文字传递:
VBAProjectName.VBAModuleName.SubroutineName
对于 COM 对象调用,您可以使用名称查找版本或 ID 编号版本。id 编号来自已发布的 COM 接口(您可以在 C++ 头文件中找到,或者可能让 JACOB 为您查找它们)。
如果您成功连接到 Excel,请务必在完成后调用 ComThread.Release()。最后把它放在一些适当的环境中。如果你的 Java 代码进程没有调用就终止了,Excel 上的 COM 引用计数就会出错,而且 Excel 进程永远不会终止,即使你退出 Excel 应用程序也是如此。一旦发生这种情况,不用说,Excel 就会开始表现得很糟糕(当你接下来尝试使用它时,它会运行但无法加载任何插件/附加组件)。如果发生这种情况(因为它可以在调试期间,尤其是如果您绕过 finally 以进行更好的调试),您必须使用任务管理器来终止 Excel 进程。