C#.Net 调用执行Excel文件中的宏(Macro)
开发测试环境:
VS2010.NET Framework4 & Excel 2003。
需求说明
最近公司要求将以前用Delphi7.0开发的自动导出数据并通过邮件发送相关人员的程序更新使用.Net开发。但由于数据的细分类型比较多且有Excel宏高手,因此决定将由Excel宏来完成相关分表明细的操作。因此通过Aspose.Cell控件导出之后,需要对其包含在Excel文件中的宏进行执行操作。具体实现步骤如下:
首先需要引用Excel组件(如图一):
(图一)
实现代码如下:
using System;
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;
namespace AutoData.Library.DataAccess
{
public class ExcelHelper
{
/// <summary>
/// RunExcelMacro: 执行Excel文件中的宏
/// </summary>
/// <param name="sExcelFile">Excel文件完整名称</param>
/// <param name="sMacroName">执行的Excel宏名称</param>
/// <param name="objMacroParameter">传入给宏的参数</param>
/// <param name="objReturn">宏返回值</param>
/// <param name="bShowExcel"></param>
public void RunExcelMacro(string sExcelFile, string sMacroName, object[] objMacroParameter, out object objReturn, bool bShowExcel)
{
try
{
if (!File.Exists(sExcelFile))
{ throw new System.Exception(sExcelFile + "文?件t不?存ä?在¨²"); }
if (string.IsNullOrEmpty(sMacroName))
{ throw new System.Exception("请?输º?入¨?宏¨º的Ì?名?称?"); }
//定义缺省参数值
object oMissing = System.Reflection.Missing.Value;
object[] paraObjects;
if (objMacroParameter == null)
paraObjects = new object[] { sMacroName };
else
{
int paraLength = objMacroParameter.Length;
paraObjects = new object[paraLength + 1];
paraObjects[0] = sMacroName;
for (int i = 0; i < paraLength; i++)
{
paraObjects[i + 1] = objMacroParameter[i];
}
}
Excel.ApplicationClass objExcel = new Excel.ApplicationClass();
if (bShowExcel)
{
objExcel.Visible = true;
}
Excel.Workbooks objBooks = objExcel.Workbooks;
Excel._Workbook objBook = null;
objBook = objBooks.Open(
sExcelFile,
oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing);
objReturn = this.RunMacro(objExcel, paraObjects);
objBook.Save();
objBook.Close(false, oMissing, oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook);
objBook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(objBooks);
objBooks = null;
objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
objExcel = null;
GC.Collect();
}
catch (Exception ex)
{
throw ex;
}
}
private object RunMacro(object objExcel, object[] objRunArgs)
{
try
{
object objReturn;
objReturn = objExcel.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod,
null, objExcel, objRunArgs);
return objReturn;
}
catch (Exception ex)
{
if (ex.InnerException.Message.ToString().Length>0)
throw ex.InnerException;
else throw ex;
}
}
}
}
问题一:通过如上代码,有可能会出现如下异常信息:无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。(如图二)
(图二)
如果碰到该异常,请到引用窗口中右键单击刚引用的Dll文件(如图三),并将其属性更改为False(如图四)。
(图三)
(图四)
最后执行效果:
调用执行之前的文件(单个Sheet工作表)
调用执行之后的文件(拆分成多个Sheet工作表)
浙公网安备 33010602011771号