2012-07-05 33 views
10

我學會了在Jxl和POI API的幫助下使用Java程序讀取和寫入Excel文件。是否可以在宏的幫助下運行Java程序?用於運行Java程序的Microsoft Excel宏

+2

檢查這一點 - [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-vba-vbscript-visual-basic-classic – sreehari 2012-07-05 11:57:35

+0

所有這些討論都告訴我們這是不可能的。 – 2012-07-05 12:13:29

+0

這個怎麼樣? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena 2012-07-05 17:44:32

回答

22

是的,這是可能的。

實際上有很多方法,我希望你喜歡我的例子。

爲了演示這一點,我創建了一個程序,其中一些文本作爲參數發送,程序以它的更改版本作爲響應。我做了一個可運行的jar。第一個示例從args和標準輸入中讀取其他參數。

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

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

你可以將它們保存在一個單罐,但你需要創建和use a manifest(這有點矯枉過正)。

現在在Excel中,我添加了一個模塊和對Windows Script Host Object的引用。如果你不喜歡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:你好瑪格斯。

如果你發現這個有用的,別忘了給予好評:d

+1

請注意,變量**程序**包含其他有用的信息,如錯誤流和返回碼。 – Margus 2012-07-05 22:04:14

+1

@sreehari我的疑問是,我已經編寫了一個程序,用於從已經存在的Excel文件中讀取單元格中的數據並對其進行處理並將其放回到同一個文件中。我對Java並不陌生,但我對Excel馬科斯來說是新手。我需要寫一個宏嗎?我對此毫無頭緒,教程也沒有提供任何信息。那麼怎麼做呢? – 2012-07-06 04:56:41

+1

要在Excel中打開VBA環境,可以使用「alt + f11」。另一種方法是使用開發人員功能區Visual Basic按鈕。 Excel的每張表都有代碼頁,但Module就像一個共享空間。請注意,我可以使用命令** java -jar「C:\ H1.jar」Margus **在CMD中運行程序 - 只需要編寫很少的代碼。 – Margus 2012-07-06 06:38:17

3

您的VBA可以將輸出寫入文件,Java可以定期輪詢文件修改並從文件讀取。並通過另一個文件將數據寫回VBA。 VBA - Java集成幾乎是不可能的,除非您只想通過System.execute(...)從shell中啓動Java程序。

+0

不正確。 VBA-Java集成遠非不可能。前段時間,甚至還有舊的Sun Java ActiveX Bridge,不幸的是它已經被Oracle停用(仍然可用於Java 1.4:http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /)。但仍有技術可用。 Obba http://www.obba.info可以使用VBA。此外可以使用xlloop。 – 2013-08-16 19:58:30

0

我用它..請注意,使用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 
+0

現在的問題是編寫一個Java程序 – user7294900 2017-07-06 13:21:25

+0

感謝您的評論,但問題是'是否可以在宏的幫助下運行Java程序?'並且這個解決方案沒有睡眠方法,以及我指向javaw而不是java – mschwehl 2017-07-07 07:53:10