web-dev-qa-db-fra.com

Macro Microsoft Excel pour exécuter le programme Java

J'ai appris à lire et à écrire un fichier Excel à l'aide d'un programme Java à l'aide de Jxl et de l'API POI. Est-il possible d'exécuter un programme Java à l'aide de macros?

9
Nimit_ZZ

Oui c'est possible.

En fait, il y a pas mal de façons et j'espère que vous aimez mes exemples.

Pour démontrer cela, je crée un programme dans lequel du texte est envoyé en tant qu'arguments et le programme répond avec une version modifiée de celui-ci. J'en ai fait une jarre coulante. Le premier exemple lit l'argument à partir d'arguments et autre à partir de l'entrée standard.

Fichier Hello.Java et 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());
    }
}

Fichier Hello2.Java et 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());
    }
}

Vous pouvez les enregistrer dans un seul fichier jar, mais vous devez ensuite créer et utiliser un manifeste (un peu excessif).

Maintenant, dans Excel, j'ajoute un module et une référence à l'objet hôte de script Windows. Si vous n'aimez pas la sleep, vous pouvez le remplacer par 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

Et pour le tester, j'ai enregistré les fichiers sur le lecteur c:\ et utilisé le code:

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

Dans mon cas, je reçois une réponse de:

STDOUT: Bonjour Margus.

STDOUT: Bonjour Margus.

Si vous avez trouvé cela utile, n'oubliez pas de passer au vote suivant: D

21
Margus

Votre VBA peut écrire la sortie dans un fichier et Java peut rechercher périodiquement des modifications de fichier et les lire à partir du fichier. Et réécrivez les données dans VBA via un autre fichier. L’intégration VBA - Java est pratiquement impossible à moins que vous ne vouliez lancer un programme Java à partir du shell via System.execute (...).

3
sreehari

je l'ai utilisé .. Attention, utilisez javaw sinon une fenêtre noire apparaît

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