Microsoft Excel宏来运行Java程序

Nim*_*_ZZ 9 java excel jxl excel-2003 excel-formula

我学会了在Jxl和POI API的帮助下使用Java程序读写Excel文件.是否可以在宏的帮助下运行Java程序?

Mar*_*gus 21

对的,这是可能的.

实际上有很多方法,我希望你喜欢我的例子.

为了证明这一点,我创建了一个程序,其中一些文本作为参数发送,程序响应它的更改版本.我制作了一个可运行的罐子.第一个示例从args和其他标准输入中读取参数.

文件Hello.javaH1.jar:

public class Hello {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");

        if (args.length > 0) 
            sb.append(' ').append(args[0]);
        System.out.println(sb.append('.').toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

文件Hello2.javaH2.jar:

import java.util.Scanner;

public class Hello2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder("Hello");

        sb.append(' ').append(sc.nextLine());
        System.out.println(sb.append('.').toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将它们保存在一个jar中,但是您需要创建并使用清单(这有点过分).

现在在Excel中我添加了一个模块和对Windows脚本宿主对象的引用.如果您不喜欢sleep,那么您可以将其替换为DoEvents:

'add a reference to Windows Script Host Object Model
'for example : Tools-References
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub RunSleep( _
    exec As WshExec, _
    Optional timeSegment As Long = 20 _
)
    Do While exec.Status = WshRunning
        Sleep timeSegment
    Loop
End Sub

Private Function RunProgram( _
    program As String, _
    Optional command As String = "" _
) As WshExec
    Dim wsh As New WshShell
    Dim exec As WshExec

    Set exec = wsh.exec(program)
    Call exec.StdIn.WriteLine(command)
    Call RunSleep(exec)
    Set RunProgram = exec
End Function
Run Code Online (Sandbox Code Playgroud)

为了测试它,我将文件保存到c:\驱动器并使用代码:

Public Sub Run()
    Dim program As WshExec
    Set program = RunProgram("java -jar ""C:\\H1.jar"" Margus")
    Debug.Print "STDOUT: " & program.StdOut.ReadAll

    Set program = RunProgram("java -jar ""C:\\H2.jar", "Margus")
    Debug.Print "STDOUT: " & program.StdOut.ReadAll
End Sub
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我得到了一个回应:

STDOUT:你好Margus.

STDOUT:你好Margus.

如果您发现这个有用,请不要忘记upvote:D