12

JxlとPOIAPIを使用して、Javaプログラムを使用してExcelファイルを読み書きする方法を学びました。マクロの助けを借りてJavaプログラムを実行することは可能ですか?

4

4 に答える 4

24

はい、可能です。

実際にはかなりの数の方法があります。私の例を気に入っていただければ幸いです。

これを実証するために、いくつかのテキストが引数として送信され、プログラムがその変更されたバージョンで応答するプログラムを作成します。実行可能なjarファイルを作成しました。最初の例では、引数を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());
    }
}

それらを1つのjarに保存できますが、マニフェストを作成して使用する必要があります(これは少しやり過ぎです)。

ここで、Excelで、モジュールとWindows ScriptHostObjectへの参照を追加します。が気に入らない場合は、次のように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:こんにちはマーガス。

STDOUT:こんにちはマーガス。

于 2012-07-05T21:59:27.960 に答える
3

VBAは出力をファイルに書き込むことができ、Javaはファイルの変更を定期的にポーリングしてファイルから読み取ることができます。そして、別のファイルを介してデータをVBAに書き戻します。VBA-System.execute(...)を介してシェルからJavaプログラムを起動するだけでない限り、Java統合はほぼ不可能です。

于 2012-07-05T13:13:06.120 に答える
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
于 2017-07-06T13:09:35.513 に答える
0

他の提案された解決策よりもはるかに優れているのは、Jinx( https://exceljava.com )を使用してJavaでExcelアドインを作成することです。

JavaでExcelマクロを作成する方法の詳細については、https://exceljava.com/docs/macros.htmlを参照してください。

マクロだけでなく、ユーザー定義の関数やメニューを作成することもできます。

実際、JavaをVBAの完全な代替として使用できます。Excelオブジェクトモデルを呼び出してJavaからVBAで実行できるすべてのことを実行できるようにする方法については、https://github.com/exceljava/jinx-com4jを参照してください。

于 2019-06-10T13:19:53.680 に答える