我学会了在Jxl和POI API的帮助下使用Java程序读写Excel文件。 是否可以在宏的帮助下运行Java程序?
检查一下 - [stackoverflow.com/questions/5297341/ [1]:stackoverflow.com/questions/5297341/
所有这些讨论都表明这是不可能的。
这个怎么样?stackoverflow.com/questions/10879757/vba-shell-java-call-errors
是的,它与Jinx - exceljava.com。 您可以用Java编写Excel函数(UDF),宏和菜单。
对的,这是可能的。
实际上有很多方法,我希望你喜欢我的例子。
为了证明这一点,我创建了一个程序,其中一些文本作为参数发送,程序响应它的更改版本。我制作了一个可运行的罐子。第一个示例从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());
}
}
您可以将它们保存在一个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
为了测试它,我将文件保存到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: Hello Margus.
STDOUT: Hello Margus.
如果您发现这个有用,请不要忘记upvote:D
请注意,变量程序包含其他有用的信息,如错误流和返回代码。
@sreehari我的疑问是,我编写了一个程序,从已经存在的Excel文件中读取单元格中的数据并处理它并将其放回到同一个文件中。我不是Java的新手,但我当然是Excel marcos的新手。我需要写一个宏吗?我对此一无所知,教程也没有给你任何信息。那怎么办呢?
要在Excel中打开VBA环境,可以使用"alt + f11"。另一种方法是使用开发人员功能区Visual Basic按钮。 Excel具有每个工作表的代码页,但模块就像一个共享空间。注意,我可以使用命令java -jar"C: H1.jar"Margus在CMD中运行程序 - 只需要编写很少的代码。
好。我想我没有明白我的怀疑。我编写java文件并将其保存在一个特定的地方。我打开excel表并在单元格中键入内容,我想获取这些单元格中的内容,处理它并将其放回到相同的excel表单中,此数据处理必须由java程序完成。这可能通过excel宏吗?我经历了ikvm,但它导致了更多的死胡同。
您的VBA可以将输出写入文件,Java可以定期轮询文件修改并从文件中读取。并通过另一个文件将数据写回VBA。 VBA - 除非您只想通过System.execute(...)从shell启动Java程序,否则几乎不可能进行Java集成。
不对。 VBA-Java集成远非不可能。不久之前,甚至有一个很好的旧的Sun Java ActiveX Bridge,不幸的是Oracle已经停止使用它(仍然可用于Java 1.4:docs.oracle.com/javase/1.4.2/docs/guide/beans/axbridge/)。但仍有技术可用。 Obba obba.info可以从VBA使用。也可以使用xlloop。
我已经习惯了..注意,使用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
问题是编写Java程序
感谢您的评论,但问题是是否可以在宏的帮助下运行Java程序?这个解决方案没有睡眠方法,我指向javaw而不是java