老菜鸟...

承诺大于命,诚信大于天

导航

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工作表)

 

posted on 2011-10-28 00:00  PMJ  阅读(2787)  评论(0)    收藏  举报