如何从java运行vbscript函数?

时间:2012-07-13 06:42:22

标签: java vbscript powerpoint

从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 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我对Visual Basic脚本方面没有那么多,但是如果你可以把你的visual basic脚本公开为COM对象,你可以通过使用框架来从java访问它的方法,例如com4j:

http://com4j.java.net/

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这篇文章回答了OP的问题:

  

否则我们可以从java代码中运行一个power point的宏...请帮助!!

(但未解决原始的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"); 
            // 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工作簿必须为“活动”(即必须 是ActiveWorkbook)否则Run将找不到VBA子例程。 (但是工作簿不一定是 屏幕可见!!这意味着您可以调用加载项中的VBA宏。)。
  2. 然后,您可以使用以下语法将宏的名称作为字符串文字传递:
  3.   

    VBAProjectName.VBAModuleName.SubroutineName

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

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