您现在的位置是:首页 > 正文

[置顶] C#执行Excel宏模版的方法

2024-02-01 00:31:49阅读 3

       在项目中如果涉及到用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;
            }
        }

}

         

转载于:https://www.cnblogs.com/kevinGao/archive/2011/09/27/2336491.html

网站文章

  • SpringBoot整合MybatisPlus(小白也秒懂)

    SpringBoot整合MybatisPlus(小白也秒懂)

    SpringBoot整合MybatisPlus

    2024-02-01 00:31:42
  • SLS机器学习最佳实战:日志聚类+异常告警

    SLS机器学习最佳实战:日志聚类+异常告警

    2019独角兽企业重金招聘Python工程师标准>>> ...

    2024-02-01 00:31:14
  • 在ubuntu系统中删除软件的三种最佳方法

    在ubuntu系统中删除软件的三种最佳方法

    三种方法分别是:1、通过软件中心删除 2、通过Synaptic Package Manager删除 3、通过命令行删除三种方法的详细介绍一、ubuntu software 1、点击左侧菜单栏上的“ubuntu software” 2、在软件中心界面,点击“installed”,可以列出已经安装过的软件。 3、软件右侧,有"remove"功能。 4、选中需要删除的软件,...

    2024-02-01 00:31:07
  • DataBinding实战(三)

    实战首先看一下之前代码public class Goods { public String name; public String details; public float price; public Goods(String name, String details, float price) { this.name = na...

    2024-02-01 00:31:00
  • 构建高效的软件测试知识体系

    2018年6月8日,作为第一届TMMi中国峰会圆桌会议的嘉宾,我参与讨论了“如何建立适合测试组织的测试规范体系”这个测试主题,其中分享了我对该话题的一些想法和经验。现在通过文章的方式将当时讲解的内容进行了一些归纳和总结,主要包括3个方面的内容: 1个故事:任何问题的解决都需要从过个层面考虑; 4个维度:构建高效的软件测试知识体系; 目标推动:综合应用4个维度推动测试目标的...

    2024-02-01 00:30:32
  • el-select 下拉框数量过多的处理方法之一

    Element-ui 下拉列表 选项过多时如何解决卡顿问题 当使用Select选择器时,如果下拉列表有几千个几万个,因此通过滚动条一个个的去找不是很现实, 这时可以对select设置filterable属性,可以在下拉控件里进行搜索。例如:

    2024-02-01 00:30:25
  • 带你正确认识Unicode和UTF-8

    带你正确认识Unicode和UTF-8

    前言 相信很多小伙伴跟我一样,之前很长一段时间对Unicode和UFT-8一直搞得不清不楚,等到用的时候就网上搜一搜,大概懂了点是什么,隔一段时间后又搞忘了,简直阔怕啊。今天我将带您轻轻松松出困境,用...

    2024-02-01 00:30:17
  • 【Redis】Redis布隆过滤器安装

    【Redis】Redis布隆过滤器安装

    Redis布隆过滤器安装

    2024-02-01 00:29:48
  • 一篇文章理解AB测试和灰度发布

    一篇文章理解AB测试和灰度发布

    一、灰度发布1.1 简介灰度发布,是指黑与白之间,能够平滑过渡的一种发布方式。通过不同策略对用户进行分流,不同的用户组使用不同的应用版本。1.2 优缺点优点互联网服务变动频繁,发布周期短。速度和质量总是难以双全。灰度发布有以下优点:(1)降低发布风险,减少影响范围(2)可以灰度测试账号,降低测试依赖,减少自测的数据构造成本(3)方便回滚缺点(1)开发、...

    2024-02-01 00:29:39
  • mybatis入门实践1)

    mybatis入门

    2024-02-01 00:29:22