【问题标题】:Microsoft Excel Macro to run Java program用于运行 Java 程序的 Microsoft Excel 宏
【发布时间】:2012-07-05 19:47:10
【问题描述】:

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

【问题讨论】:

标签: java excel excel-formula excel-2003 jxl


【解决方案1】:

是的,有可能。

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

为了证明这一点,我创建了一个程序,其中一些文本作为参数发送,程序以修改后的版本作为响应。我做了一个可运行的罐子。第一个示例从 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());
    }
}

文件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());
    }
}

您可以将它们保存在一个 jar 中,但是您需要 create 和 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

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

标准输出:你好马格斯。

标准输出:你好马格斯。

【讨论】:

  • 请注意,变量 program 包含额外的有用信息,例如错误流和返回码。
  • @sreehari 我的疑问是,我编写了一个程序,它从已经存在的 Excel 文件中的单元格中读取数据并处理它并将其放回同一个文件。我不是 Java 新手,但我肯定是 Excel marcos 的新手。我需要写一个宏吗?我对此一无所知,教程也没有给你任何信息。那么如何实现呢?
  • 在Excel中打开VBA环境,可以使用“alt+f11”。另一种方法是使用开发人员功能区 Visual Basic 按钮。 Excel 的每个工作表都有代码页,但 Module 就像一个共享空间。请注意,我可以使用命令 java -jar "C:\H1.jar" Margus 在 CMD 中运行程序 - 需要编写的代码非常少。
  • 好的。我想我还没有把我的怀疑说清楚。我编写 java 文件并将其保存在一个特定的位置。我打开 excel 表并在单元格中输入一些内容,我想获取这些单元格中的内容,对其进行处理并将其放回同一个 excel 表中,并且此数据处理必须由 java 程序完成。这可以通过excel宏实现吗?我经历了ikvm,但它导致了更多的死胡同。
【解决方案2】:

比其他建议的解决方案更好的是使用 Jinx (https://exceljava.com) 在 Java 中创建 Excel 加载项。

有关如何用 Java 编写 Excel 宏的详细信息,请参阅 https://exceljava.com/docs/macros.html

除了宏,还可以编写用户定义的功能和菜单。

事实上,您可以使用 Java 作为 VBA 的完全替代品!请参阅https://github.com/exceljava/jinx-com4j,了解如何调用 Excel 对象模型,让您可以在 Java 中使用 VBA 做所有事情。

【讨论】:

  • 这个工具有两个缺点 - 它是付费的,而且它不支持 MacOS(仅支持 Windows)。
【解决方案3】:

我已经用过了..注意,使用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
【解决方案4】:

您的 VBA 可以将输出写入文件,Java 可以定期轮询文件修改并从文件中读取。并通过另一个文件将数据写回VBA。 VBA - Java 集成几乎是不可能的,除非您只想通过 System.execute(...) 从 shell 中触发 Java 程序。

【讨论】:

猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2012-06-16
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多