2012-07-05 16 views
10

Nauczyłem się czytać i pisać plik Excela przy użyciu programu Java za pomocą interfejsu API Jxl i POI. Czy można uruchomić program Java za pomocą makr?Makro Microsoft Excel do uruchomienia programu Java

+2

sprawdzić ten - [http://stackoverflow.com/questions/5297341/calling-java-library-jar-from-vba-vbscript-visual-basic-classic][1] [1]: http: // stackoverflow.com/questions/5297341/calling-java-library -jar-from-vba-vbscript-visual-basic-classic – sreehari

+0

Wszystkie te dyskusje mówią, że nie jest to możliwe. –

+0

Co powiesz na to? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena

Odpowiedz

22

Tak, jest to możliwe.

Rzeczywiście istnieje wiele sposobów i mam nadzieję, że podoba mi się moje przykłady.

Aby to zademonstrować, tworzę program, w którym tekst jest wysyłany jako argumenty, a program odpowiada zmienioną wersją. Zrobiłem z tego słoik. Pierwszy przykład odczytuje argument z args i innych ze standardowego wejścia.

pliku Hello.java i 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()); 
    } 
} 

pliku Hello2.java i 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()); 
    } 
} 

Można zapisać je w pojedynczy słoik, ale musisz utworzyć i use a manifest (to trochę przesada).

Teraz w programie Excel dodaję moduł i odwołanie do obiektu Host skryptów systemu Windows. Jeśli nie podoba ci się sleep, można zastąpić go 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 

I przetestować go uratowałem pliki do c:\ napędu i wykorzystał kod:

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 

W moim przypadku uzyskaj odpowiedź:

STDOUT: Hello Margus.

STDOUT: Cześć Margus.

Jeśli znalazłeś to przydatne, nie zapomnij upvote: D

+1

Należy zauważyć, że zmienny ** program ** zawiera dodatkowe przydatne informacje, takie jak strumień błędów i kod powrotu. – Margus

+1

@sreehari Wątpię, napisałem program, który odczytuje dane z komórek z już istniejącego pliku Excel i przetwarza go i umieszcza z powrotem w tym samym pliku. Nie jestem nowy w Javie, ale z pewnością jestem nowy w marce Excel. Czy muszę napisać makro? Nie mam pojęcia o tym, a samouczki nie dają żadnych informacji. Jak więc można to zrobić? –

+1

Aby otworzyć środowisko VBA w Excelu, możesz użyć "alt + f11". Alternatywnym sposobem byłoby użycie przycisku wstążki programisty Visual Basic. Excel ma strony kodowe dla każdego arkusza, ale moduł jest podobny do przestrzeni wspólnej. Zauważ, że mogę użyć polecenia ** java -jar "C: \ H1.jar" Margus **, aby uruchomić program w CMD - jest bardzo mało kodu, który trzeba zapisać. – Margus

3

Twój VBA może zapisywać dane wyjściowe do pliku, a Java może okresowo odpytywać o modyfikacje plików i czytać z pliku. I zapisz dane z powrotem do VBA za pomocą innego pliku. VBA - integracja Java jest prawie niemożliwa, chyba że chcesz tylko wystrzelić program Java z powłoki przez System.execute (...).

+0

Nieprawda. Integracja VBA-Java jest daleka od niemożliwości.Jakiś czas temu istniał nawet stary dobry Sun Java ActiveX Bridge, który niestety został przerwany przez Oracle (nadal dostępny dla Java 1.4: http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /). Ale wciąż są dostępne technologie. Obba http://www.obba.info może być używany z VBA. Można również użyć xlloop. –

0

Użyłem go .. Uwaga, należy javaw inaczej czarne okna pojawiały się

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 
+0

Pytanie brzmiało, jak napisać program Java – user7294900

+0

dziękuję za komentarz, ale pytanie brzmiało "Czy można uruchomić program Java za pomocą makr?" a to rozwiązanie robi to bez metody sleep i wskazywałem javaw zamiast java – mschwehl

Powiązane problemy