幫助類僅提供了一個方法: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宏方法:
2
3 Sheet1.Cells(1, 1) = Now
4
5 End Sub
6
7
8 Sub getTime2(title As String)
9
10 Sheet1.Cells(2, 1) = 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 有返回值的宏調用
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 }