3

从 java 代码中,我可以使用此代码运行 vbscript

Runtime.getRuntime().exec("wscript C:\\ppt\\test1.vbs ");

但是想知道如何从java中调用vbscript的方法..例如在test1.vbs

Set objPPT = CreateObject("PowerPoint.Application")
    objPPT.Visible = True
    Set objPresentation = objPPT.Presentations.Open("C:\ppt\Labo.ppt")
    Set objSlideShow = objPresentation.SlideShowSettings.Run.View
    sub ssn1()
      objPPT.Run "C:\ppt\Labo.ppt!.SSN"
    End sub

如何从 java 中仅调用 ssn1() 方法。否则我们可以从 java 代码中运行 power point 的宏。请帮助!

4

4 回答 4

1

这应该会让你开心 :) 转到 WScript 部分:http ://technet.microsoft.com/library/ee156618.aspx

这是我的想法...在您的 vbscript 文件中,让您的脚本监听一个命令行参数,该参数将指定要调用的方法。然后,在 Java 中,您只能在想要调用文件中的特定方法时使用此参数。

否则,如果您想在 java 中访问 powerpoint,您将需要像在 vbscript 中那样访问它的 API,如果 vbscript 可以做到这一点,这是可能的,但方法/语法可能会改变。

于 2012-07-13T07:04:08.923 回答
0

我对 Visual Basic 脚本方面不太感兴趣,但是如果您可以将 Visual Basic 脚本公开为 COM 对象,则可以通过使用框架(例如 com4j)从 java 访问它的方法:

http://com4j.java.net/

于 2012-07-13T06:49:06.177 回答
0

PowerPoint 应用程序对象的 .Run 方法允许您在任何打开的演示文稿或加载的加载项中调用任何公共子例程或函数

于 2012-07-13T12:16:44.013 回答
0

这篇文章回答了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 宏/子例程,必须满足以下条件:

  1. 包含宏的 Excel 工作簿必须是“Active”(即必须是 ActiveWorkbook),否则 Run 将找不到 VBA 子例程。(但是工作簿不必在屏幕上可见!!这意味着您可以调用加载项中的 VBA 宏!)。
  2. 然后,您可以使用以下语法将宏的名称作为字符串文字传递:

VBAProjectName.VBAModuleName.SubroutineName

对于 COM 对象调用,您可以使用名称查找版本或 ID 编号版本。id 编号来自已发布的 COM 接口(您可以在 C++ 头文件中找到,或者可能让 JACOB 为您查找它们)。

如果您成功连接到 Excel,请务必在完成后调用 ComThread.Release()。最后把它放在一些适当的环境中。如果你的 Java 代码进程没有调用就终止了,Excel 上的 COM 引用计数就会出错,而且 Excel 进程永远不会终止,即使你退出 Excel 应用程序也是如此。一旦发生这种情况,不用说,Excel 就会开始表现得很糟糕(当你接下来尝试使用它时,它会运行但无法加载任何插件/附加组件)。如果发生这种情况(因为它可以在调试期间,尤其是如果您绕过 finally 以进行更好的调试),您必须使用任务管理器来终止 Excel 进程。

于 2012-07-13T15:05:25.227 回答