我学会了在Jxl和POI API的帮助下使用Java程序读写Excel文件。是否可以在宏的帮助下运行Java程序?
答案 0 :(得分:21)
是的,这是可能的。
实际上有很多方法,我希望你喜欢我的例子。
为了证明这一点,我创建了一个程序,其中一些文本作为参数发送,程序以其更改版本进行响应。我制作了一个可运行的罐子。第一个示例从args和其他标准输入中读取参数。
档案 Hello.java 和 H1.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());
}
}
档案 Hello2.java 和 H2.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());
}
}
你可以将它们保存在一个罐子里,但是你需要创建和use a manifest(这有点矫枉过正)。
现在在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
为了测试它,我将文件保存到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
在我的情况下,我得到了回复:
STDOUT:你好Margus。
STDOUT:你好Margus。
如果您发现这有用,请不要忘记upvote:D
答案 1 :(得分:3)
您的VBA可以将输出写入文件,Java可以定期轮询文件修改并从文件中读取。并通过另一个文件将数据写回VBA。 VBA - 除非你只想通过System.execute(...)从shell发出Java程序,否则几乎不可能进行Java集成。
答案 2 :(得分:1)
我已经习惯了..注意,使用javaw否则会弹出一个黑色的窗口
Dim result As String
Dim commandstr As String
commandstr = "javaw -jar somejar someparameter"
' try with or without cast to string
result = CStr( shellRun(commandstr) )
'somewhere from SO but forget.. sorry for missing credits
Public Function ShellRun(sCmd As String) As String
'Run a shell command, returning the output as a string'
Dim oShell As Object
Set oShell = CreateObject("WScript.Shell")
'run command'
Dim oExec As Object
Dim oOutput As Object
Set oExec = oShell.exec(sCmd)
Set oOutput = oExec.StdOut
'handle the results as they are written to and read from the StdOut object'
Dim s As String
Dim sLine As String
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbCrLf
Wend
ShellRun = s
End Function
答案 3 :(得分:0)
比其他建议的解决方案更好的是,使用Jinx(https://stackblitz.com/edit/react-eqxyqy)在Java中创建Excel加载项。
有关如何用Java编写Excel宏的详细信息,请参见https://exceljava.com。
除了宏之外,还可以编写用户定义的功能和菜单。
实际上,您可以将Java完全替代VBA!有关如何调用Excel对象模型以使您能够从Java在VBA中做所有事情的信息,请参见https://exceljava.com/docs/macros.html。