2012-07-05 13 views
10

मैंने जेएक्सएल और पीओआई एपीआई की सहायता से जावा प्रोग्राम का उपयोग करके एक्सेल फ़ाइल को पढ़ और लिखना सीखा है। मैक्रोज़ की मदद से जावा प्रोग्राम चलाने के लिए संभव है?जावा प्रोग्राम चलाने के लिए माइक्रोसॉफ्ट एक्सेल मैक्रो

+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-from-vba-vbscript-visual-basic-classic – sreehari

+0

ये सभी चर्चाएं बताती हैं कि यह संभव नहीं है। –

+0

इस बारे में कैसे? http://stackoverflow.com/questions/10879757/vba-shell-java-call-errors – JimmyPena

उत्तर

22

हां, यह संभव है।

वास्तव में कुछ तरीके हैं और मुझे उम्मीद है कि आप मेरे उदाहरण पसंद करेंगे।

इस प्रदर्शन करने के लिए, मैं एक कार्यक्रम है जहाँ कुछ पाठ यह के परिवर्तित संस्करण के साथ प्रतिक्रिया करता है तर्कों और कार्यक्रम के रूप में भेज रहा है बनाएँ। मैंने इसका एक चलने वाला जार बनाया। पहला उदाहरण तर्क से तर्क और मानक इनपुट से अन्य को पढ़ता है।

फ़ाइल 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()); 
    } 
} 

आप उन्हें एक में बचा सकता है एकल जार, लेकिन फिर आपको बनाने की आवश्यकता है और use a manifest (यह थोड़ा अधिक है)।

अब एक्सेल में मैं एक मॉड्यूल और विंडोज स्क्रिप्ट होस्ट ऑब्जेक्ट का संदर्भ जोड़ता हूं। आप 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:: नमस्ते Margus की एक प्रतिक्रिया मिलता है।

STDOUT: हैलो मार्गस।

आप पाया अगर यह उपयोगी है, मत भूलना वोट दें करने के लिए: डी

+1

ध्यान दें कि परिवर्तनीय ** प्रोग्राम ** में अतिरिक्त उपयोगी जानकारी जैसे त्रुटि स्ट्रीम और रिटर्न कोड है। – Margus

+1

@ श्रीहरि मेरा संदेह है, मैंने एक प्रोग्राम लिखा है जो पहले से मौजूद एक्सेल फ़ाइल से सेल्स से डेटा पढ़ता है और इसे संसाधित करता है और इसे उसी फ़ाइल में वापस रखता है। मैं जावा के लिए नया नहीं हूं लेकिन मैं निश्चित रूप से एक्सेल मार्कोस में नया हूं। क्या मुझे मैक्रो लिखना है? मुझे इसके बारे में कोई जानकारी नहीं है और ट्यूटोरियल आपको कोई जानकारी नहीं देते हैं। तो यह कैसे किया जा सकता है? –

+1

एक्सेल में वीबीए पर्यावरण खोलने के लिए, आप "alt + f11" का उपयोग कर सकते हैं। वैकल्पिक तरीका डेवलपर रिबन विजुअल बेसिक बटन का उपयोग करना होगा। एक्सेल में प्रत्येक शीट के लिए कोड पेज हैं, लेकिन मॉड्यूल एक साझा स्थान की तरह है। ध्यान दें, कि मैं सीएमडी में प्रोग्राम चलाने के लिए कमांड ** जावा -जर "सी: \ एच 1.jar" मार्गस ** का उपयोग कर सकता हूं - बहुत कम कोड है जिसे लिखे जाने की आवश्यकता है। – Margus

3

आपका VBA एक फाइल करने के लिए उत्पादन में लिख सकते हैं और जावा फ़ाइल संशोधन के लिए समय-समय पर मतदान और फ़ाइल से पढ़ सकते हैं। और डेटा को दूसरी फ़ाइल के माध्यम से वीबीए में वापस लिखें। वीबीए - जावा एकीकरण असंभव के बगल में है जब तक कि आप सिर्फ system.execute (...) के माध्यम से खोल से जावा प्रोग्राम को आग नहीं करना चाहते हैं।

+0

सत्य नहीं है। वीबीए-जावा एकीकरण असंभव से बहुत दूर है।कुछ समय पहले भी पुराना सन जावा एक्टिवैक्स ब्रिज था, जिसे दुर्भाग्य से ओरेकल द्वारा बंद कर दिया गया था (अभी भी जावा 1.4 के लिए उपलब्ध है: http://docs.oracle.com/javase/1.4.2/docs/guide/beans/ axbridge/developerguide /)। लेकिन अभी भी प्रौद्योगिकियां उपलब्ध हैं। Obba http://www.obba.info का उपयोग वीबीए से किया जा सकता है। Xlloop भी इस्तेमाल किया जा सकता है। –

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

प्रश्न जावा प्रोग्राम – user7294900

+0

लिखना था टिप्पणी के लिए धन्यवाद लेकिन सवाल यह था कि 'क्या मैक्रोज़ की मदद से जावा प्रोग्राम चलाने के लिए संभव है?' और यह समाधान नींद-विधि के बिना करता है और साथ ही मैंने जावा के बजाए जाव की ओर इशारा किया – mschwehl

संबंधित मुद्दे