如何在Java中运行VBScript函数?

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代码运行PowerPoint的宏吗?请帮忙!
4个回答

1

这应该会让你高兴 :) 前往 WScript 部分:http://technet.microsoft.com/library/ee156618.aspx

这是我的想法... 在你的 vbscript 文件中,让你的脚本监听一个命令行参数,指定要调用哪个方法。然后,在 Java 中,每当你想要调用文件中的特定方法时,你只需要使用这个参数。

否则,如果你想在 Java 中访问 PowerPoint,你将需要像在 vbscript 中一样访问它的 API,这是可能的,但方法/语法可能会有所改变。


0

我对 Visual Basic 脚本方面不是很熟悉,但如果您可以将您的 Visual Basic 脚本公开为 COM 对象,那么您就可以通过使用诸如 com4j 等框架从 Java 访问其方法:

http://com4j.java.net/


0

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


0
这篇文章回答了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"); 
            // 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. 然后,您可以使用以下语法将宏的名称作为字符串文字传递:

VBAProjectName.VBAModuleName.SubroutineName

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

如果您成功连接到Excel,请确保在完成后调用ComThread.Release()。将其放置在适当的finally语句中。如果您的Java代码进程在不调用它的情况下终止,则Excel上的COM引用计数将是错误的,并且即使在退出Excel应用程序后,Excel进程也永远不会终止。一旦发生这种情况,毫无疑问,Excel开始表现得很奇怪(当您尝试下次使用它时,它会运行但无法加载任何插件/附加组件)。如果发生这种情况(特别是在绕过finally语句以进行更好的调试时),则必须使用任务管理器来终止Excel进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接