在项目中如果涉及到用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/2192942.html

[置顶]C#执行Excel宏模版的方法相关推荐

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

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

  2. 百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp)

    百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp) 参考文章: (1)百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp) (2)https:// ...

  3. [置顶] 火车票余票接口API使用方法

    之前有很多人和我要火车票余票接口的api,铁道部频繁升级程序,导致余票的数据一直失败,参看文章: 快春运了,做个火车余票查询接口,余票来源12306,图是百度地图, 这个虽然叫做火车余票接口,但是我要 ...

  4. Excel 宏的用法的教程

    Excel表格的35招必学秘技(学会计的快来转...         一.让不同类型数据用不同颜色显示    在工资表中,如果想让大于等于2000元的工资总额以"红色"显示,大于等 ...

  5. 什么软件可以将win窗口进行置顶_电脑极简指南,这5个方法可以帮你节约生命...

    1.阅读本文预计需要 10 分钟,并提供了资源下载.2.本文是「电脑爱好者」专题C09篇的更新版本.3.第一时间获取更新,欢迎关注「奔跑中的奶酪」. 导读 北方的朋友可能不知道,在南方的菜市场,如果你 ...

  6. rpa操作excel_全面解析RPA与Excel宏的区别

    RPA和Excel宏(Macro)都能自动执行日常办公任务,节约时间成本,提高工作效率.那么,它们之间有何区别? Excel宏是什么? Excel中的宏是一种记录任务的功能.它会记住一系列任务步骤,并 ...

  7. excel中的宏如何用java表示_一文看懂RPA与Excel宏的区别

    RPA和Excel宏(Macro)都能自动执行日常办公任务,节约时间成本,提高工作效率.那么,它们之间有何区别? Excel宏是什么? Excel中的宏是一种记录任务的功能.它会记住一系列任务步骤,并 ...

  8. matlab怎样返回前一步,执行完宏怎样恢复上一步

    用VBA可以恢复,但不能通过Excel内置的功能自动实现.您可以使用VBA代码记录下运行宏程序前单元格或单元格区域原先的内容,在"撤销"命令中调用以恢复程序运行前的状态. 您可以使 ...

  9. Qt 调用 Windows 接口实现窗口置顶

    前言 用 Qt 做 Windows 软件开发,有时候会用到窗口置顶功能,其实 Qt 有自带的接口来实现窗口置顶,但是效果并不太理想,比如说没办法置顶于系统标题栏,或者在全屏状态下如果有键盘事件的时候窗 ...

最新文章

  1. AI一分钟 | 谷歌租下北京 6000 平米写字楼,或将发展AI项目;工信部就个人信息保护约谈百度、支付宝、今日头条
  2. 如何使用OpenCV和Socket进行视频聊天?
  3. 【编码】-小Ho的防护盾-2016.08.14
  4. 祝全天下的教师,节日快乐!
  5. error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值...
  6. 大学计算机2级考证计划书,计算机二级培训计划书..doc
  7. Linux ab 命令
  8. ZZULIOJ 1100: 求组合数(函数专题)
  9. Linux scp 两台服务器传输文件
  10. ExtJS2.0.1 ColumnTree控件使用心得
  11. 朴素贝叶斯python实现预测_Python朴素贝叶斯预测.PDF
  12. win10显示文件后缀
  13. 芯片数据分析步骤7 合并重复探针
  14. 桌面管理器(gdm、lightdm)启动后——到界面显示时间优化
  15. R语言 dataframe 取指定行列filter 随机取数
  16. nginx配置和优化详解
  17. 用python三角形_python 三角形
  18. 对话白先勇:中国文化是世界上最美的
  19. 软件测试有效性指标,评价软件测试的有效性
  20. 『数据结构』海量数据处理

热门文章

  1. cad立面索引符号 规范_一套标准规范施工图包含哪些?13年深化设计师3分钟带你正确认知...
  2. python图像分类代码_python实现支持向量机遥感图像分类
  3. 台式电脑如何截屏_如何选购台式电脑显卡?小白装机通俗易懂的独立显卡知识指南...
  4. PHP中的错误控制运算符
  5. arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析
  6. java动态sql执行数据
  7. Hibernate与数据库分表
  8. SQL中两个表的某列相减
  9. [电子商务网站设计] 之 My Space
  10. DynamipsGUI2.8 交换模块试用(Etherchannel)