2012-07-05 36 views
10

Tôi đã học cách đọc và viết một tệp Excel bằng cách sử dụng một chương trình Java với sự trợ giúp của API Jxl và POI. Có thể chạy một chương trình Java với sự trợ giúp của các macro không?Macro Microsoft Excel để chạy chương trình Java

+2

Kiểm tra này - [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

Tất cả các cuộc thảo luận đều nói rằng điều đó là không thể. –

+0

Làm thế nào về điều này? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena

Trả lời

22

Có, điều đó là có thể.

Có một vài cách thực sự và tôi hy vọng bạn thích ví dụ của tôi.

Để chứng minh điều này, tôi tạo một chương trình trong đó một số văn bản được gửi dưới dạng đối số và chương trình phản hồi bằng phiên bản thay đổi của nó. Tôi đã làm một cái lọ runnable của nó. Ví dụ đầu tiên đọc đối số từ args và khác từ đầu vào tiêu chuẩn.

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

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

Bạn có thể lưu chúng trong một lọ duy nhất, nhưng sau đó bạn cần tạo và use a manifest (đó là một chút quá mức cần thiết).

Bây giờ trong Excel tôi thêm một mô-đun và tham chiếu đến đối tượng lưu trữ Windows Script. Nếu bạn không thích những sleep, sau đó bạn có thể thay thế nó với 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 

Và để kiểm tra nó tôi đã lưu các tập tin vào c:\ ổ đĩa và sử dụng mã:

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 

Trong trường hợp của tôi, tôi nhận được phản hồi:

STDOUT: Xin chào Margus.

STDOUT: Xin chào Margus.

Nếu bạn thấy điều này hữu ích, đừng quên upvote: D

+1

Lưu ý rằng chương trình ** biến ** chứa thông tin hữu ích bổ sung như luồng lỗi và mã trả về. – Margus

+1

@sreehari Nghi ngờ của tôi là, tôi đã viết một chương trình đọc dữ liệu từ các ô từ một tệp Excel đã tồn tại và xử lý nó và đưa nó trở lại cùng một tệp. Tôi không phải là người mới đối với Java nhưng tôi chắc chắn là người mới đối với các marcos của Excel. Tôi có cần viết macro không? Tôi không có đầu mối về nó và các hướng dẫn không cung cấp cho bạn bất kỳ thông tin. Vậy làm thế nào nó có thể được thực hiện? –

+1

Để mở môi trường VBA trong Excel, bạn có thể sử dụng "alt + f11". Cách thay thế sẽ là sử dụng nút phát triển Visual Basic ribbon. Excel có các trang mã cho mỗi trang tính, nhưng Mô-đun giống như một không gian dùng chung. Lưu ý, tôi có thể sử dụng lệnh ** java -jar "C: \ H1.jar" Margus ** để chạy chương trình trong CMD - có rất ít mã cần được viết. – Margus

3

VBA của bạn có thể ghi đầu ra vào một tệp và Java có thể thăm dò ý kiến ​​để sửa đổi tệp định kỳ và đọc từ tệp. Và ghi dữ liệu trở lại VBA thông qua một tệp khác. VBA - Tích hợp Java là bên cạnh không thể trừ khi bạn chỉ muốn kích hoạt một chương trình Java từ trình bao thông qua System.execute (...).

+0

Không đúng sự thật. Tích hợp VBA-Java là không thể.Một thời gian trước đây thậm chí còn có cả Sun Java ActiveX Bridge cũ, mà không may đã bị ngừng bởi Oracle (vẫn có sẵn cho Java 1.4: http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /). Nhưng vẫn có những công nghệ sẵn có. Obba http://www.obba.info có thể được sử dụng từ VBA. Cũng có thể sử dụng xlloop. –

0

tôi đã sử dụng nó .. Chú ý, sử dụng javaw khác một cửa sổ đen popping lên

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

Câu hỏi đặt ra là viết một chương trình Java – user7294900

+0

cảm ơn bạn đã bình luận nhưng câu hỏi là 'Có thể chạy chương trình Java với sự trợ giúp của macro không?' và giải pháp này làm điều đó mà không có phương pháp ngủ cũng như tôi chỉ vào javaw thay vì java – mschwehl

Các vấn đề liên quan