2012-07-05 108 views
10

He aprendido a leer y escribir un archivo Excel usando un programa Java con la ayuda de Jxl y POI API. ¿Es posible ejecutar un programa Java con la ayuda de macros?Microsoft Excel Macro para ejecutar el programa Java

+2

Comprobar esto - [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-de-vba-vbscript-visual-basic-classic – sreehari

+0

Todas esas discusiones dicen que no es posible. –

+0

¿Qué tal esto? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena

Respuesta

22

Sí, es posible.

De hecho, existen muchas maneras y espero que te gusten mis ejemplos.

Para demostrar esto, creo un programa donde se envía un poco de texto como argumentos y el programa responde con una versión alterada del mismo. Hice un bote ejecutable. El primer ejemplo lee el argumento de args y otro de la entrada estándar.

Archivo Hello.java y 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()); 
    } 
} 

Archivo Hello2.java y 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()); 
    } 
} 

puede guardarlos en una solo jar, pero luego necesitas crear y use a manifest (eso es un poco exagerado).

Ahora, en Excel, agrego un módulo y una referencia al Objeto de host de Windows Script. Si no te gusta el sleep, a continuación, se puede reemplazar con 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 

Y para probarlo me salvó los archivos a c:\ unidad y utiliza el código:

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 

En mi caso obtener una respuesta de:

STDOUT: Hola Margus.

STDOUT: Hola Margus.

Si has encontrado este útil, no se olvide de upvote: D

+1

Tenga en cuenta que la variable ** programa ** contiene información útil adicional, como flujo de error y código de retorno. – Margus

+1

@sreehari Mi duda es que he escrito un programa que lee los datos de las celdas de un archivo Excel ya existente y lo procesa y lo vuelve a poner en el mismo archivo. No soy nuevo en Java pero definitivamente soy nuevo en marcos de Excel. ¿Necesito escribir una macro? No tengo idea al respecto y los tutoriales no te dan ninguna información. Entonces, ¿cómo se puede hacer? –

+1

Para abrir el entorno de VBA en Excel, puede usar "alt + f11". Otra forma sería usar el botón Visual Basic de la cinta del desarrollador. Excel tiene páginas de códigos para cada hoja, pero el Módulo es como un espacio compartido. Tenga en cuenta que puedo usar el comando ** java -jar "C: \ H1.jar" Margus ** para ejecutar el programa en CMD - hay muy poco código que deba escribirse. – Margus

3

Su VBA puede escribir la salida en un archivo y Java puede sondear periódicamente las modificaciones de archivos y leer desde el archivo. Y vuelva a escribir los datos en VBA a través de otro archivo. VBA: la integración con Java es casi imposible, a menos que solo desee activar un programa Java desde el shell a través de System.execute (...).

+0

No es cierto. La integración de VBA-Java está lejos de ser imposible.Hace un tiempo, existía incluso el antiguo puente Sun Java ActiveX Bridge, que lamentablemente ha sido interrumpido por Oracle (todavía disponible para Java 1.4: http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /). Pero todavía hay tecnologías disponibles. Obba http://www.obba.info puede usarse desde VBA. También se podría usar xlloop. –

0

Lo he utilizado .. Atención, utiliza javaw otra manera una ventana negro está surgiendo

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

La pregunta era escribir un programa Java – user7294900

+0

gracias por el comentario, pero la pregunta era '¿Es posible ejecutar un programa Java con la ayuda de macros?' y esta solución lo hace sin el método del sueño, así como apunté a javaw en lugar de java – mschwehl

Cuestiones relacionadas