wake-up-neo.com

Microsoft Excel-Makro zum Ausführen eines Java-Programms

Ich habe gelernt, eine Excel-Datei mithilfe eines Java-Programms mit Hilfe von Jxl und der POI-API zu lesen und zu schreiben. Ist es möglich, ein Java-Programm mit Hilfe von Makros auszuführen?

9
Nimit_ZZ

Ja, es ist möglich.

Es gibt tatsächlich einige Möglichkeiten und ich hoffe, Ihnen gefallen meine Beispiele.

Um dies zu demonstrieren, erstelle ich ein Programm, in dem Text als Argumente gesendet wird und das mit einer geänderten Version reagiert. Ich habe ein lauffähiges Glas daraus gemacht. Das erste Beispiel liest das Argument aus args und das andere aus der Standardeingabe.

Datei Hello.Java und 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());
    }
}

Datei Hello2.Java und 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());
    }
}

Sie können sie in einem einzigen Glas speichern, aber dann müssen Sie ein Manifest erstellen und verwenden (das ist ein bisschen übertrieben).

Jetzt füge ich in Excel ein Modul und einen Verweis auf Windows Script Host Object hinzu. Wenn Ihnen die sleep nicht gefällt, können Sie sie durch DoEvents ersetzen:

'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

Und um es zu testen, habe ich die Dateien auf dem c:\ Laufwerk gespeichert und den Code verwendet:

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

In meinem Fall bekomme ich eine Antwort von:

STDOUT: Hallo Margus.

STDOUT: Hallo Margus.

Wenn Sie dies nützlich fanden, vergessen Sie nicht, Ihre Meinung zu verbessern: D

21
Margus

Ihr VBA kann die Ausgabe in eine Datei schreiben und Java kann in regelmäßigen Abständen nach Dateiänderungen suchen und aus der Datei lesen. Und schreiben Sie die Daten über eine andere Datei zurück in VBA. Die VBA-Java-Integration ist so gut wie unmöglich, es sei denn, Sie möchten über System.execute (...) nur ein Java-Programm aus der Shell starten.

3
sreehari

ich habe es benutzt. Achtung, benutze Javaw, sonst taucht ein schwarzes Fenster auf

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
1
mschwehl

Viel besser als die anderen vorgeschlagenen Lösungen ist es, ein Excel-Add-In in Java mit Jinx ( https://exceljava.com ) zu erstellen.

Weitere Informationen zum Schreiben von Excel-Makros in Java finden Sie unter https://exceljava.com/docs/macros.html .

Neben Makros können auch benutzerdefinierte Funktionen und Menüs geschrieben werden.

Tatsächlich können Sie Java als vollständigen Ersatz für VBA verwenden! Informationen zum Aufrufen von Excel finden Sie unter https://github.com/exceljava/jinx-com4j Object Model, mit dem Sie alles in VBA von Java aus tun können.

0
Tony Roberts