当前位置:  编程技术>.net/c#/asp.net

c#执行excel宏模版的方法

    来源: 互联网  发布时间:2014-10-27

    本文导语:  在项目中如果涉及到用Excel开发的报表模版来导出报表数据的话,一般都是在Excel报表中使用VBA做成宏来进行调用。即先使用Excel自带的VBA开发好报表模版,然后再将模版程序放在固定目录下,在管理软件中对这些报表模版进行...

在项目中如果涉及到用Excel开发的报表模版来导出报表数据的话,一般都是在Excel报表中使用VBA做成宏来进行调用。即先使用Excel自带的VBA开发好报表模版,然后再将模版程序放在固定目录下,在管理软件中对这些报表模版进行调用。这样就不需要使用其它报表工具来进行开发了,因为Excel功能比较强大,一般的应用的报表用它来开发绰绰有余了。而且这样开发的成本也很低,不需要再购买其它专业的报表开发软件直接使用Office开发即可。使用Excel开发的宏模版当然要使用上层程序来调用宏模版了。我以前在工作中就开发过Excel模版,并使用C#程序调用过这些模版程序。规则是首先将报表需要的数据填冲到DataTable或者DataSet中,然后将DataTable或者DataSet中数据导出Excel中。
现提供导出Excel模版的代码如下:

代码如下:

namespace ExcelTest
{
    public class ExelTemplate
    {
        private static Excel.Application ExcelApp;//Define a Excel Application object
        private static Excel._Workbook ExcelWB;//define a Excel workbook object
        private static Excel._Worksheet ExcelWS;//define a Excel workbook worksheet
       //将报表所需的主数据放入dtHeader,明细数据放入dtDetail中,调用的模版名称为strTemplateFileName,导出的报表名称为strOutFileName
        public static bool FillContent(string strTemplateFileName, string strOutFileName, System.Data.DataTable dtHeader, System.Data.DataTable dtDetail)
        {
            bool flag = true;
            FileInfo fileInfo = new FileInfo(strTemplateFileName);
            System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            try
            {
                //Start Excel and get Application object.               
                ExcelApp = new Excel.Application();
                ExcelApp.Visible  = false;

                //Get a new workbook.
                ExcelWB = (Excel._Workbook)(ExcelApp.Workbooks.Add(strTemplateFileName));

                //Fill content.注意这里的Header和Detail分别对应模版文件中的Header和Detail两个Sheet页,这2个Sheet是专门用来存放明主数据或者明细数据的。
                if (!FillWorksheet("Header", dtHeader)) return false;
                if (!FillWorksheet("Detail", dtDetail)) return false;
                //Run macro.

                ExcelApp.Run("SetData", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                ExcelApp.DisplayAlerts = false;
                //=========================================================================================================
                //Delete Header and Detail.
                //((Excel._Worksheet)ExcelWB.Sheets["Header Information"]).Delete();              
                //((Excel._Worksheet)ExcelWB.Sheets["Detail Information"]).Delete();
 

                //=========================================================================================================
                ExcelApp.DisplayAlerts = true;
                //Delete old file.
                File.Delete(strOutFileName);
                //Save excel file.
                ExcelWB.SaveAs(strOutFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                // Quit Excel.
                ExcelWB.Close(false, strOutFileName, Missing.Value);//*******************            
                MarshalReleaseComObject(ExcelWB);
                ExcelApp.Quit();

               
                //Kill excel application.
                //KillProcess("EXCEL");//******************

            }
            catch (Exception ex)
            {
                throw ex;  
                flag = false;
            }
            finally
            {
                MarshalReleaseComObject(ExcelApp);
                GC.Collect();
            }
            return flag;
        }
        //将报表所需的主数据放入dtHeader,明细数据放入dtDetail中,调用的模版名称为strTemplateFileName,导出的报表名称为strOutFileName
        public static bool FillContent(string strTemplateFileName, string strOutFileName, System.Data.DataSet dsdata)
        {
            bool flag = true;
            FileInfo fileInfo = new FileInfo(strTemplateFileName);
            System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            try
            {
                //Start Excel and get Application object.               
                ExcelApp = new Excel.Application();
                ExcelApp.Visible = false;
                //Get a new workbook.
                 ExcelWB = (Excel._Workbook)(ExcelApp.Workbooks.Add(strTemplateFileName));
                 //Fill content.
                //if (!FillWorksheet("Header", dtHeader)) return false;
                //if (!FillWorksheet("Detail", dtDetail)) return false;
                //Fill content.注意这里的没有写明对应模版文件中Sheet页,但是指定了dsdata.Tables[i].TableName为Sheet页的名字,这样方便灵活设置,而且这样可以有多个Sheet是专门用来存放明主数据或者明细数据的。
                for (int i = 0; i < dsdata.Tables.Count; i++)
                {
                    if (!FillWorksheet(dsdata.Tables[i].TableName, dsdata.Tables[i]))
                        return false;
                }
                //Run macro.

                ExcelApp.Run("SetData", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                ExcelApp.DisplayAlerts = false;
                //=========================================================================================================
                //Delete Header and Detail.
                //((Excel._Worksheet)ExcelWB.Sheets["Header Information"]).Delete();              
                //((Excel._Worksheet)ExcelWB.Sheets["Detail Information"]).Delete();
 

                //=========================================================================================================
                ExcelApp.DisplayAlerts = true;
                //Delete old file.
                File.Delete(strOutFileName);
                //Save excel file.

                ExcelWB.SaveAs(strOutFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                // Quit Excel.
                ExcelWB.Close(false, strOutFileName, Missing.Value);//*******************            
                MarshalReleaseComObject(ExcelWB);
                ExcelApp.Quit();

            }
            catch (Exception ex)
            {
                throw ex;
                flag = false;
            }
            finally
            {
                MarshalReleaseComObject(ExcelApp);
                GC.Collect();
            }
            return flag;
        }
        //使用Excel来导出报表时,在服务器上的Excel进程容易死掉,导致资源无法释放,因此需要使用这个方法来释放死掉的进程
        private static void MarshalReleaseComObject(object objCom)
        {
            try
            {
                int i = 1;
                if (objCom != null && System.Runtime.InteropServices.Marshal.IsComObject(objCom))
                {
                    do
                    {
                        i = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom);
                    } while (i > 0);
                }
            }
            finally
            {
                objCom = null;
            }
        }
}


    
 
 

您可能感兴趣的文章:

  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • C# 执行bat批处理文件的小例子
  • C#实现将记事本中的代码编译成可执行文件的方法
  • 使用 C# 动态编译代码和执行的代码
  • C#实现终止正在执行的线程
  • C#中执行批处理文件(*.bat)的方法代码
  • PowerShell 定时执行.Net(C#)程序的方法
  • C#中验证sql语句是否正确(不执行语句)
  • C#代码验证sql语句是否正确(只验证不执行sql)的方法
  • C#中如何执行存储过程方法
  • c#执行外部命令示例分享
  • c#动态编译执行对象方法示例 运用映射机制创建对象
  • javascript函数中执行c#函数的方法
  • C#计算代码执行时间的方法
  • linux操作系统安装MONO执行C#程序的详解步骤
  • C#执行Javascript代码的几种方法总结
  • c#中executereader执行查询示例分享
  • 解析C#中用Process类杀死进程,执行命令的深入分析
  • 带着问题读CLR via C#(笔记一)CLR的执行模型
  • c#实现用SQL池,多线程定时批量执行SQL语句的方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎么判断shell的exec方法所执行的方法是否正确?
  • JQuery给元素绑定click事件多次执行的解决方法
  • applet在网页关闭时,一定会执行destroy()方法嘛?一定给分!!!
  • SMF问题:"svcadm enable xxx" 中'enable'的执行方法可以修改么?
  • 求教:使用crontab如何完成每间隔80分钟的执行一个命令的方法?
  • PHP异步执行模拟多线程的方法
  • java中用什么方法调用外部可执行文件?
  • java如何能定时(比如说0.1秒)执行一个固定的方法?
  • jQuery页面加载完毕再执行代码多种方法
  • Servlet在关闭后是否执行doDestroy()方法?
  • 批量执行sql语句的方法
  • MySQL 存储过程中执行动态SQL语句的方法
  • CI框架在CLI下执行占用内存过大问题的解决方法
  • Java程序执行时间的2种简单方法
  • linux下用C写个客户端程序,定时执行该程序的方法!
  • Android加载对话框同时异步执行实现方法
  • sqlserver中通过osql/ocmd批处理批量执行sql文件的方法
  • 在SQLServer上查看SQL语句的执行时间的方法
  • PHP服务器端异步执行方法解析
  • sql server执行update语句超级慢的原因与解决方法
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • 怎么在一个程序的执行过程中中止执行它?比如一个按钮的响应程序中,执行一半中止??20分!!!
  • linux下通过crond实现自动执行程序
  • 我用GCC生成的可执行文件无法直接在shell命令行下执行,这是为什么?可以用调试器调入执行。我用Red Hat7.0
  • linux下nm命令(显示可执行文件的符号信息)介绍以及常见nm命令用法举例
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • Microsoft IE MSHTML内存破坏远程代码执行漏洞
  • 请问:我发现如果在/usr/local/bin 与/usr/bin下都有同一个执行文件时,当在shell下执行时,只会执行/usr/local/bin,下的,怎么改过来?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • SUSE10下,如何使用perl语言执行一条语句:从一台机器telnet到远端另一台机器,在远端机器上执行命令,并能获取到执行结果。请高手指点,Very 谢谢~
  • linux下不使用sudo命令执行docker的操作步骤


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3