c#調用excel中的vba宏

幫助類僅提供了一個方法:RunExcelMacro
參數說明:
       string         excelFilePath  Excel文件路徑        
       string         macroName    宏名稱
        object[]     parameters     宏參數組
        out object  rtnValue         宏返回值
        bool            isShowExcel   執行時是否顯示Excel


補充說明:VBA宏需如下圖寫在模塊中,才能被此方法識別。寫在ThisWorkBook中不能被識別。

執行Excel VBA宏幫助類,註釋比較詳細,不再累贅代碼過程。最核心部分其實就是通過反射方式調用Excel VBA宏,oBook.Save()這句話也很重要,否則即使執行了VBA宏調用,也不會保存Excel更改後的內容

幫助類需添加引用:Microsoft Excel 11.0 Object Library

 

 using System;
  using System.Collections.Generic;
  using System.Text;
  using Excel = Microsoft.Office.Interop.Excel;
  using Microsoft.Office.Core;
  using System.IO;


namespace eLims.Core.DAL
{
    public class ExcelMacroHelper
    {

        public void RunExcelMacro(
                                             string excelFilePath,
                                             string macroName,
                                             object[] parameters,
                                             out object rtnValue,
                                             bool isShowExcel
                                         )
        {
            try
            {
                #region 檢查入參

                // 檢查文件是否存在
                if (!File.Exists(excelFilePath))
                {
                    throw new System.Exception(excelFilePath + " 文件不存在");
                }

                // 檢查是否輸入宏名稱
                if (string.IsNullOrEmpty(macroName))
                {
                    throw new System.Exception("請輸入宏的名稱");
                }

                #endregion

                #region 調用宏處理

                // 準備打開Excel文件時的缺省參數對象
                object oMissing = System.Reflection.Missing.Value;

                // 根據參數組是否爲空,準備參數組對象
                object[] paraObjects;

                if (parameters == null)
                {
                    paraObjects = new object[] { macroName };
                }
                else
                {
                    // 宏參數組長度
                    int paraLength = parameters.Length;

                    paraObjects = new object[paraLength + 1];

                    paraObjects[0] = macroName;
                    for (int i = 0; i < paraLength; i++)
                    {
                        paraObjects[i + 1] = parameters[i];
                    }
                }

                // 創建Excel對象示例
                Excel.ApplicationClass oExcel = new Excel.ApplicationClass();

                // 判斷是否要求執行時Excel可見
                if (isShowExcel)
                {
                    // 使創建的對象可見
                    oExcel.Visible = false;
                }

                // 創建Workbooks對象
                Excel.Workbooks oBooks = oExcel.Workbooks;

                // 創建Workbook對象
                Excel._Workbook oBook = null;

                // 打開指定的Excel文件
                oBook = oBooks.Open(
                                        excelFilePath,
                                        oMissing,
                                        oMissing,
                                        oMissing,
                                        oMissing,
                                        oMissing,
                                        oMissing,
                                       oMissing,
                                       oMissing,
                                       oMissing,
                                       oMissing,
                                       oMissing,
                                       oMissing,
                                       oMissing,
                                       oMissing
                                  );

                // 執行Excel中的宏
                rtnValue = this.RunMacro(oExcel, paraObjects);
                
                // 保存更改
                oBook.Save();

                // 退出Workbook
                oBook.Close(false, oMissing, oMissing);

                #endregion

                #region 釋放對象

                // 釋放Workbook對象
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
                oBook = null;

                // 釋放Workbooks對象
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
                oBooks = null;

                // 關閉Excel
                oExcel.Quit();

                // 釋放Excel對象
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
                oExcel = null;

                // 調用垃圾回收
                GC.Collect();

                #endregion
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }







        private object RunMacro(object oApp, object[] oRunArgs)
         {
             try
             {
                 // 聲明一個返回對象
                 object objRtn;
                 
                 // 反射方式執行宏
                 objRtn = oApp.GetType().InvokeMember(
                                                         "Run",
                                                         System.Reflection.BindingFlags.Default |
                                                         System.Reflection.BindingFlags.InvokeMethod,
                                                         null,
                                                         oApp,
                                                         oRunArgs
                                                     );
 
                 // 返回值
                 return objRtn;
 
             }
             catch (Exception ex)
             {
                // 如果有底層異常,拋出底層異常
                 if (ex.InnerException.Message.ToString().Length > 0)
                {
                     throw ex.InnerException;
                 }
                 else
                 {
                     throw ex;
                 }
             }
         }


    }

}


 

 

示例三個VBA宏方法:

 1 Sub getTime()
 2 
 3     Sheet1.Cells(11= Now
 4 
 5 End Sub
 6 
 7 
 8 Sub getTime2(title As String)
 9 
10     Sheet1.Cells(21= title & " : " & Now
11 
12 End Sub
13 
14 Function getTime3(title As String As String
15 
16     getTime3 = title & " : " & Now
17 
18 End Function
19 

 

 

對應的三個使用方法
1 不帶參數的宏調用(兼演示執行過程顯示Excel文件)
2 帶參數的宏調用(兼演示執行過程不顯示Excel文件)
3 有返回值的宏調用

 

 1         private void btnExe_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 // 返回對象
 6                 object objRtn = new object();
 7 
 8                 // 獲得一個ExcelMacroHelper對象
 9                 ExcelMacroHelper excelMacroHelper = new ExcelMacroHelper();
10 
11                 // 執行指定Excel中的宏,執行時顯示Excel
12                 excelMacroHelper.RunExcelMacro(
13                                                     @"E:\csharp_study\DoVBAMacro\test.xls",
14                                                     "getTime2",
15                                                     new Object[] { "現在時刻" },
16                                                     out objRtn,
17                                                     true
18                                               );
19 
20                 // 執行指定Excel中的宏,執行時不顯示Excel
21                 excelMacroHelper.RunExcelMacro(
22                                                     @"E:\csharp_study\DoVBAMacro\test.xls",
23                                                     "getTime2",
24                                                     new Object[] { "現在時刻" },
25                                                     out objRtn,
26                                                     false
27                                                );
28 
29                 // 執行指定Excel中的宏,執行時顯示Excel,有返回值
30                 excelMacroHelper.RunExcelMacro(
31                                                     @"E:\csharp_study\DoVBAMacro\test.xls",
32                                                     "getTime3",
33                                                     new Object[] { "現在時刻" },
34                                                     out objRtn,
35                                                     true
36                                                );
37 
38                 MessageBox.Show((string)objRtn);
39 
40             }
41             catch(System.Exception ex)
42             {
43                 MessageBox.Show(ex.Message);
44             }
45         }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章