2016-01-29 2 views
5

से एडिन के साथ एक्सेल एप्लिकेशन शुरू करना मेरे पास एक सी # ऐप है और इसे एक्सेल एप्लिकेशन & बनाने की आवश्यकता है, फिर कार्यपुस्तिका खोलें। मुद्दा यह है कि जब एक्सेल खुलता है तो लोड होने के लिए मुझे ब्लूमबर्ग एडिन की आवश्यकता होती है। मुझे मिली एकमात्र तरीका इस पोस्ट में working example है।सी # अनुप्रयोग

यह वास्तव में एक्सेल और ब्लूमबर्ग कार्यों का उपयोग करने में सक्षम बनाता है। हालांकि मैं सोच रहा था कि क्या MyXl को xlApp में डालने का कोई तरीका है, जहां xlApp माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल.एपप्लिकेशन है?

var myXl = Process.Start("excel.exe"); 

कारण किया जा रहा है मैं एक पुस्तकालय कुछ उपयोगी समारोह मैं का उपयोग करना चाहते हैं है जो है, लेकिन यह प्रकार Microsoft.Office.Interop.Excel.Application के एक पैरामीटर की जरूरत है। मैं यह कैसे करु?

+2

एक्सेल लाइब्रेरी का संदर्भ जोड़ें और var myXL के बजाय आप कार्यपुस्तिका ऑब्जेक्ट को तुरंत चालू कर सकते हैं Excel.Aplication myXl = नया Excel.Aplication(); – Sorceri

+0

हालांकि इसके साथ समस्या ब्लूमबर्ग एडिन उस विधि का उपयोग करके लोड नहीं होती है – mHelpMe

+0

क्या आपने यह पोस्ट देखा है: http: // stackoverflow।कॉम/प्रश्न/213375/लोडिंग-एडिन-जब-एक्सेल-इज़-इंस्टीट्यूटेड-प्रोग्रामेटिक रूप से –

उत्तर

0

myXL आप किसी कार्यपुस्तिका वस्तु

Excel.Application myXl = New Excel.Application(); 

तो फिर तुम बस मैन्युअल रूप से ऐड-इन लोड करने के लिए की जरूरत का दृष्टांत कर सकते हैं वर की एक्सेल पुस्तकालय के लिए एक संदर्भ जोड़ें और बजाय।

 foreach (Excel.AddIn item in myXl.AddIns) 
     { 
      if (item.Name.Equals("BLOOMBERG ADDIN NAME")) 
      { 
       item.Installed = true; 
      } 
     } 
3

आप एक्सेल को बाहरी एप्लिकेशन से स्वचालित कर सकते हैं। अधिक जानकारी के लिए How to automate Microsoft Excel from Microsoft Visual C#.NET और C# app automates Excel (CSAutomateExcel) देखें।

Application वर्ग ऐड-इन्स तक पहुँचने के लिए निम्नलिखित गुण प्रदान करता है:

  • AddIns - रिटर्न एक AddIns संग्रह है कि ऐड-इन्स संवाद बॉक्स में सूचीबद्ध सभी ऐड-इन्स का प्रतिनिधित्व करता है (पर ऐड-इन्स आदेश डेवलपर टैब); एक्सएलएल एड-इन्स।
  • COMAddIns - माइक्रोसॉफ्ट एक्सेल के लिए COMAddIns संग्रह देता है, जो वर्तमान में स्थापित COM एड-इन्स का प्रतिनिधित्व करता है।

इसलिए, यदि आपको यह सुनिश्चित करने की आवश्यकता है कि COM एड-इन सक्षम है तो आपको एप्लिकेशन क्लास की ComAddins संपत्ति का उपयोग करने की आवश्यकता है।

यह एक्सेल शुरू कर देंगे, तो एक ही है कि प्रक्रिया बस शुरू में चलाता है खोजने के लिए चल रहा है वस्तु-सूची में पंजीकृत सभी कार्यपुस्तिकाएं के माध्यम से जाना:

1

आप नीचे दिए गए कोड का उपयोग कर सकते हैं। ऐसा करने के लिए, इसे कार्यपुस्तिका के विंडो हैंडल की प्रक्रिया आईडी मिलती है और इसे अभी शुरू की गई प्रक्रिया की आईडी से तुलना करता है।

यह रनिंग ऑब्जेक्ट टेबल में दिखने में प्रतीक्षा अवधि के साथ कई बार दोहराया जाता है क्योंकि एक्सेल को शुरू होने के बाद आरओटी के साथ पंजीकरण करने के लिए कुछ समय चाहिए। धीमे कंप्यूटर पर आपको maxAttempts और waitTimeMS बढ़ाने की आवश्यकता हो सकती है।

यदि सही कार्यपुस्तिका पाई जाती है, तो यह वापस आती है। नमूना में, मैं एक्सेल अनुप्रयोग उदाहरण के पहले सेल में "हैलो वर्ल्ड" लिखूंगा।

private void button1_Click(object sender, EventArgs e) 
{ 
    Microsoft.Office.Interop.Excel.Application excelApplication = StartExcel(); 

    if (excelApplication != null) 
    { 
     excelApplication.ActiveCell.Value = "Hello World"; 
    } 
} 

[DllImport("user32.dll", SetLastError = true)] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); 

[DllImport("ole32.dll")] 
private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 

private Microsoft.Office.Interop.Excel.Application StartExcel() 
{ 
    // Maximum number of attempts to look for started Excel Application 
    const int maxAttempts = 3; 
    // Number of milliseconds to wait between attempts to look for started Excel Application 
    const int waitTimeMS = 200; 

    Microsoft.Office.Interop.Excel.Application result = null; 

    // Start Excel 
    var process = Process.Start("Excel.exe"); 
    process.WaitForInputIdle(); 

    // Try to find started Excel Application 

    int currentAttempt = 1; 

    while ((result == null) && (currentAttempt <= maxAttempts)) 
    { 
     // Wait between attempts 
     if(currentAttempt != 1) 
     { 
      Thread.Sleep(waitTimeMS); 
     } 

     // List all running Excel automation objects and find the one with the same process id 
     IRunningObjectTable lRunningObjectTable = null; 
     IEnumMoniker lMonikerList = null; 

     try 
     { 
      // Query Running Object Table 
      if (GetRunningObjectTable(0, out lRunningObjectTable) == 0 && lRunningObjectTable != null) 
      { 

       // List Monikers 
       lRunningObjectTable.EnumRunning(out lMonikerList); 

       // Start Enumeration 
       lMonikerList.Reset(); 

       // Array used for enumerating Monikers 
       IMoniker[] lMonikerContainer = new IMoniker[1]; 

       IntPtr lPointerFetchedMonikers = IntPtr.Zero; 

       // foreach Moniker 
       while (lMonikerList.Next(1, lMonikerContainer, lPointerFetchedMonikers) == 0) 
       { 
        object lComObject; 
        lRunningObjectTable.GetObject(lMonikerContainer[0], out lComObject); 

        // Check the object is an Excel workbook 
        if (lComObject is Microsoft.Office.Interop.Excel.Workbook) 
        { 
         Microsoft.Office.Interop.Excel.Workbook lExcelWorkbook = (Microsoft.Office.Interop.Excel.Workbook)lComObject; 

         // Get the Process ID for the Window Handle 
         uint processId; 
         GetWindowThreadProcessId(new IntPtr(lExcelWorkbook.Application.Hwnd), out processId); 

         if (processId == process.Id) 
         { 
          // Correct automation object found, return Application 
          result = lExcelWorkbook.Application; 
          break; 
         } 
        } 
       } 
      } 
     } 
     finally 
     { 
      // Release ressources 
      if (lRunningObjectTable != null) Marshal.ReleaseComObject(lRunningObjectTable); 
      if (lMonikerList != null) Marshal.ReleaseComObject(lMonikerList); 
     } 

     currentAttempt++; 
    } 


    return result; 
} 
संबंधित मुद्दे