如何使用 Visual C#来自动执行 Office 程序的运行实例

 我来答
崔师尊
2015-08-26 · TA获得超过9317个赞
知道大有可为答主
回答量:3387
采纳率:36%
帮助的人:1759万
展开全部
本文分步骤介绍如何从 Visual C# .NET 自动化客户端调用 Office 宏。

通过使用 Microsoft Office 自动化,您可以打开或创建一个新的包含 Visual Basic for Applications (VBA) 宏的文档并在运行时执行该宏。

下面的自动化客户端示例根据您在窗体上的选择操纵 Office 自动化服务器(Access、Excel、PowerPoint 或 Word)。当客户端启动自动化服务器后,将打开一个文档并接着调用两个宏。第一个宏是 DoKbTest,它没有参数。第二个宏是 DoKbTestWithParameter,有一个“String”类型的参数。

创建包含宏的 Office 文档

创建一个名为 C:\Doc1.doc 的 Word 文档。为此,请按照下列步骤操作:
在 Word 中,创建一个新文档。
按 Alt+F11 打开 Visual Basic 编辑器。
在“插入”菜单上,单击“模块”。
将下面的宏代码粘贴到新模块中:
'Display a message box that displays the application name.
Public Sub DoKbTest()
MsgBox "Hello from " & Application.Name
End Sub

'Display a message box with the string passed from the
'Automation client.
Public Sub DoKbTestWithParameter( sMsg As String )
MsgBox sMsg
End Sub

关闭 Visual Basic 编辑器,保存该 Word 文档,然后退出 Word。
使用与创建 Word 文档类似的步骤,创建一个名为 C:\Book1.xls 的 Excel 工作簿。
使用与创建 Word 文档类似的步骤,创建一个名为 C:\Pres1.ppt 的 PowerPoint 演示文稿。
创建一个名为 C:\Db1.mdb 的新 Access 数据库。为此,请按照下列步骤操作:
在“插入”菜单上,单击“模块”。
将宏代码粘贴到该新模块中。
保存该模块,然后退出 Access。
创建 Visual C# .NET 自动化客户端

启动 Microsoft Visual Studio .NET。在“文件”菜单上,单击“新建”,然后单击“项目”。在“项目类型”下,单击“Visual C# 项目”,然后单击“模板”下的“Windows 应用程序”。默认情况下会创建 Form1。
添加对 Access、Excel、PowerPoint 和 Word 对象库的引用。为此,请按照下列步骤操作:
在“项目”菜单上,单击“添加引用”。
在“COM”选项卡上,找到“Microsoft Word 10.0 对象库或 Microsoft Word 11.0 对象库”,然后单击“选择”。注意:如果您使用的是 Office XP 且尚未执行此操作,Microsoft 建议您下载并安装 Microsoft Office XP 主互操作程序集 (PIA)。有关 Office XP PIA 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
328912 Microsoft Office XP 主互操作程序集 (PIA) 可供下载
为 Access、Excel 和 PowerPoint 对象库重复上一步。
在“添加引用”对话框中,单击“确定”以接受您的选择。如果系统提示您为选定的库生成包装,请单击“是”。
在“视图”菜单上,单击“工具箱”。向 Form1 添加一个“Combo Box”控件和一个“Button”控件。
双击“Button1”为按钮的“Click”事件处理程序生成定义。
将下面的代码粘贴到“button1_Click”处理程序中:
private void button1_Click(object sender, System.EventArgs e)
{
// Object for missing (or optional) arguments.
object oMissing = System.Reflection.Missing.Value;

//Switch based on the user selection.
switch (comboBox1.SelectedIndex)
{
case 0:
// Create an instance of Microsoft Access, make it visible,
// and open Db1.mdb.
Access.ApplicationClass oAccess = new Access.ApplicationClass();
oAccess.Visible = true;
oAccess.OpenCurrentDatabase("c:\\db1.mdb", false, "");

// Run the macros.
RunMacro(oAccess, new Object[]{"DoKbTest"});
RunMacro(oAccess, new Object[]{"DoKbTestWithParameter",
"Hello from C# Client."});

// Quit Access and clean up.
oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oAccess);
oAccess = null;

break;

case 1:
// Create an instance of Microsoft Excel, make it visible,
// and open Book1.xls.
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
oExcel.Visible = true;
Excel.Workbooks oBooks = oExcel.Workbooks;
Excel._Workbook oBook = null;
oBook = oBooks.Open("c:\\book1.xls", oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

// Run the macros.
RunMacro(oExcel, new Object[]{"DoKbTest"});
RunMacro(oExcel, new Object[]{"DoKbTestWithParameter",
"Hello from C# Client."});

// Quit Excel and clean up.
oBook.Close(false, oMissing, oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook);
oBook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks);
oBooks = null;
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel);
oExcel = null;

break;

case 2:

// Create an instance of PowerPoint, make it visible,
// and open Pres1.ppt.
PowerPoint.ApplicationClass oPP = new PowerPoint.ApplicationClass();
oPP.Visible = MsoTriState.msoTrue;
PowerPoint.Presentations oPresSet = oPP.Presentations;
PowerPoint._Presentation oPres = oPresSet.Open("c:\\pres1.ppt",
MsoTriState.msoFalse, MsoTriState.msoFalse,
MsoTriState.msoTrue);

// Run the macros.
RunMacro(oPP, new Object[]{"'pres1.ppt'!DoKbTest"});
RunMacro(oPP, new Object[]{"'pres1.ppt'!DoKbTestWithParameter",
"Hello from C# Client."});

// Quit PowerPoint and clean up.
oPres.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oPres);
oPres = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject (oPresSet);
oPresSet = null;
oPP.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oPP);
oPP = null;

break;

case 3:

// Create an instance of Word, make it visible,
// and open Doc1.doc.
Word.ApplicationClass oWord = new Word.ApplicationClass();
oWord.Visible = true;
Word.Documents oDocs = oWord.Documents;
object oFile = "c:\\doc1.doc";

// If the Microsoft Word 10.0 Object Library is referenced
// use the following code.
Word._Document oDoc = oDocs.Open(ref oFile, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing);

// If the Microsoft Word 11.0 Object Library is referenced comment
// the previous line of code and uncomment the following code.
//Word._Document oDoc = oDocs.Open(ref oFile, ref oMissing,
//ref oMissing, ref oMissing, ref oMissing, ref oMissing,
//ref oMissing, ref oMissing, ref oMissing, ref oMissing,
//ref oMissing, ref oMissing, ref oMissing, ref oMissing,
//ref oMissing, ref oMissing);

// Run the macros.
RunMacro(oWord, new Object[]{"DoKbTest"});
RunMacro(oWord, new Object[]{"DoKbTestWithParameter",
"Hello from C# Client."});

// Quit Word and clean up.
oDoc.Close(ref oMissing, ref oMissing, ref oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oDoc);
oDoc = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject (oDocs);
oDocs = null;
oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWord);
oWord = null;

break;

}

GC.Collect(); //Garbage collection.
}

在“button1_Click”处理程序之后添加下面的函数:
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null, oApp, oRunArgs);
}

在“视图”菜单上,单击“设计器”,然后双击“Form1”,以生成该窗体的“Load”事件的定义。
将下面的代码粘贴到“Form1_Load”处理程序中:
private void Form1_Load(object sender, System.EventArgs e)
{
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.Items.AddRange(new object[]
{"Access", "Excel", "PowerPoint", "Word"});
comboBox1.SelectedIndex = 0;
}

滚动到代码窗口的顶部,然后将下面的代码行添加到“using”指令列表的末尾:
using System.Reflection;
using Access = Microsoft.Office.Interop.Access;
using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Word = Microsoft.Office.Interop.Word;
using Microsoft.Office.Core;

运行并测试自动化客户端

按 F5,以运行该应用程序。
从“ComboBox1”中选择一个 Office 应用程序,然后单击“Button1”。随即将启动您所选的 Office 应用程序,并运行 DoKBTest 和 DoKBTestWithParameter 宏。
疑难解答

当您在 Visual C# .NET 项目中引用 Access 10.0 对象库时,可能会收到一条错误消息,说明未能将该库转换为 .NET 程序集。

有关如何解决此错误以成功引用 Access 10.0 对象库的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
317157 PRB:在使用 Visual Studio .NET 引用 Access 10.0 类型库时出错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式