`
weizhai12
  • 浏览: 149416 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

C#执行Excel宏模版的方法

 
阅读更多

在项目中如果涉及到用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#执行excel宏模版的方法

    在C#中,执行Excel宏模板的方法涉及到对Microsoft Office Interop库的使用,这是一个允许.NET应用程序与Microsoft Office应用程序(如Excel)进行交互的组件。以下是一个详细的步骤和代码示例来解释如何实现这一过程...

    C# 导出利用模板,映射文件导出复杂excel

    本主题聚焦于如何使用C#来实现一个复杂的Excel导出功能,结合模板和映射文件,以及可能涉及的操作Excel宏。这个过程通常是为了满足业务需求,如自定义报告生成、数据分析和数据可视化。 首先,我们要理解什么是模板...

    C# excel导入导出 宏求和统计

    (注:此导出的excel是通过模板demo.xls导出的,模板写了一个求和宏,执行宏:打开导出的excel文件打开 工具-宏-宏-执行宏(求和);即可看到total处显示求和结果,实现求和统计) 2.导入: 点击按钮浏览后, 点按钮...

    Excel模板导出(针对复杂模板情况)

    在IT行业中,Excel模板导出是一项常见的数据处理任务,尤其在面对复杂模板情况时,它显得尤为重要。这种技术主要用于批量生成或更新具有统一格式的Excel文件,例如财务报告、销售统计或是数据分析等场景。下面我们将...

    Excel Add-Ins(C#例子)

    Excel Add-Ins是微软Excel应用程序的一种扩展功能,它允许开发者使用编程语言,如C#,来创建自定义功能,如宏、工具栏按钮、菜单项等,以增强Excel的默认功能。C#作为.NET框架的主要编程语言,为开发Excel插件提供了...

    在C#中利用Excel做高级报表

    为了制作高级报表,我们采用了一种更智能的方法——利用Excel宏自动排版。这种方法的优势在于减少了手工编码的工作量,并且可以随时修改模板而无需更改程序代码。 1. **创建模板**:首先创建一个Excel文件作为模板...

    excel套打模板(含源码)

    这份模板可能包含了特定的宏或VBA(Visual Basic for Applications)代码,这些代码会在Excel中执行特定的操作,如自动填充数据、根据条件调整格式等。 总的来说,这个“excel套打模板(含源码)”为用户提供了设计...

    Excel根据表格,批量生成sqlserver语句 ,生成建表语句,自行到数据库中执行

    标题提到的“Excel根据表格,批量生成sqlserver语句,生成建表语句,自行到数据库中执行”,就是一种利用Excel宏自动化生成SQL Server建表语句的方法。这种方法适用于已有数据结构清晰的Excel表格,通过特定的规则...

    C#操作WORD操作EXCEL操作TXT文档案例源代码

    在提供的压缩包文件“C#操作WORD操作EXCEL操作TXT文档案例”中,你将找到这些操作的实际案例源代码,包括如何处理更复杂的工作,例如数据的导入导出、模板的应用、宏的使用等。通过研究这些代码,你可以深入理解如何...

    Excel嵌入OLE控件并触发事件

    1. **创建VSTO加载项项目**:在Visual Studio中,选择“新建项目”,然后在模板中找到“Office”类别,选择“Excel 20XX VSTO加载项”(根据你的Excel版本选择合适的模板)。 2. **设计用户界面**:打开生成的Excel...

    C#来修改和删除数据

    这通常涉及查找和替换操作,或者执行包含这些操作的Excel宏。宏可以在VBA编辑器中编写,然后在C#中通过`Run`方法执行: ```csharp excelApp.Run("宏名", 参数1, 参数2, ...); ``` 在实际应用中,可能还需要考虑...

    2018最新Office插件开发之使用ExcelDNA开发XLL插件免费教学视频

    ExcelDNA是一个开源框架,它简化了.NET语言(如C#)与Excel之间的交互过程。以下是对每一课时所涉及的核心知识点的深入解析: ### Lesson1:开发常识及获取免费的开发环境 - **开发常识**:了解XLL插件的基本概念...

    一个有关Excel的例子

    7. **宏集成**:如果需要,还可以利用已有的Excel宏,通过C#调用执行。 通过这样的软件,用户可以避免手动操作Excel的繁琐,提高工作效率,同时还能根据自己的业务需求进行定制化开发。这不仅体现了Excel的灵活性,...

    vba for excel/word/outlook

    VBAXL10.CHM可能是Excel VBA的帮助文档,包含了详细的功能和方法介绍。 3. **Word VBA**:在Word中,VBA允许开发人员自定义模板、文档格式、邮件合并等功能。你可以创建宏来自动插入文本、应用样式、检查拼写错误等...

    EXCEL add in 示例

    1. **设置项目**:在Visual Studio中,选择“Visual C#”-&gt;“Office/SharePoint”-&gt;“2010”或更高版本的“Excel 加载项”模板来创建新项目。这将自动配置项目结构,并包含必要的引用(如Microsoft.Office.Interop....

    智能标签(Excel)

    智能标签(Excel)是Microsoft Office ...这个压缩包文件可能包含了示例代码或模板,帮助开发者理解如何在Excel中使用C#实现智能标签功能。通过研究和学习这些资源,开发者可以更深入地了解和实践C#与Excel的集成开发。

    Microsoft Excel Add-In

    这些Add-Ins通常由开发者编写,采用VBA(Visual Basic for Applications)或其他编程语言如C#或VSTO(Visual Studio Tools for Office),为Excel添加了新的功能、宏或自动化流程。 Excel Add-In的安装通常通过执行...

Global site tag (gtag.js) - Google Analytics