有助于 MS Office 自动化的鲜为人知的技巧
本文介绍了一个技巧,可以帮助您创建使用 MS Office 自动化的应用程序。
引言
您是否曾经想过如何进行 Microsoft Office 自动化?您是否对 Word 或 Excel 或其他产品有一些经验,但就是无法将其编程为执行您想要的操作?好吧,我发现了一个很棒的小技巧,我将与您分享,它经常帮助我弄清楚如何进行 Office 自动化。
背景
什么是 Microsoft Office 自动化?它是使用 OLE 和 COM 对象钩子在您的编程代码中集成 Microsoft Office 套件的过程。您为什么要这样做?我发现通常需要执行某些操作或显示某些内容,如果我们可以使用 MS Office 在后台完成它,那将非常方便。也许您需要以 Word 或 Excel 格式进行一些自定义输出。在许多情况下,您可以使用一些报告工具导出为 RTF 或 Excel。但有时,您尝试创建的输出足够独特,需要使用 MS Office 自动化进行编程。
我最近使用 MS Office 自动化做的事情是,我使用 Word 添加了一个页面页脚,其中包含带有当前日期时间戳的字段。我的应用程序已经在使用 Word 打印 RTF 文档。RTF 是使用 Crystal Reports 创建的。用户希望在 RTF 上打印日期。我认为唯一可以做到这一点的方法是使用 Word 自动化。
这个技巧
一个词:宏。我知道听起来太简单了。几年前,当我正在 Delphi 应用程序中进行一些 Excel 自动化时,我发现无法在网上或书中找到任何有用的参考资料来帮助我弄清楚我想做的事情。无论如何,我最终发现,如果我在 Excel 中开始录制一个宏(这在 Word 等中有效),并执行我在自动化中尝试执行的任何操作,我发现宏代码总是非常接近我需要在自动化中编写的代码,以获得相同的结果。
一个示例
以下是在 Word 中启动宏的方法
接下来,我们将插入一个日期到页眉中,同时录制宏。
接下来,我们停止宏并查看它创建的代码。单击“工具”>“宏”>“宏”,将出现此窗口
选择您刚刚录制的宏,然后单击“编辑”。
您需要知道您正在寻找的代码。这是我们感兴趣的宏代码
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldDate
C# 代码如下所示
wordApp.ActiveWindow.ActivePane.View.SeekView =
Microsoft.Office.Interop.Word.WdSeekView.wdSeekCurrentPageFooter;
wordApp.Selection.Fields.Add(wordApp.Selection.Range,
ref fieldtype, ref datetime, ref isFalse);
您可以看到代码与宏代码非常相似。以下是添加当前日期时间到 Word 文档的完整源代码
// give any file name of your choice.
object fileName = "c:\\temp\\test.doc";
object read_only = false;
object visible = true;
object isFalse = false;
//provide a date format for the date we are inserting.
object datetime = @"DATE \@ ""yyyy/MM/dd hh:mm:ss""";
object fieldtype =
Microsoft.Office.Interop.Word.WdFieldType.wdFieldDate;
// the way to handle parameters you don't care about in .NET
object missing = System.Reflection.Missing.Value;
// Open the document that was chosen by the dialog
Microsoft.Office.Interop.Word.ApplicationClass wordApp =
new Microsoft.Office.Interop.Word.ApplicationClass();
wordApp.Visible = false;
Microsoft.Office.Interop.Word.Document aDoc =
wordApp.Documents.Open(
ref fileName, ref missing, ref read_only,
ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref visible, ref missing,
ref missing, ref missing, ref missing );
try
{
wordApp.ActiveWindow.ActivePane.View.SeekView =
Microsoft.Office.Interop.Word.WdSeekView.wdSeekCurrentPageFooter;
wordApp.Selection.Fields.Add(wordApp.Selection.Range,
ref fieldtype, ref datetime, ref isFalse);
aDoc.Save();
}
finally
{
aDoc.Close(ref isFalse, ref missing, ref missing);
wordApp.Quit(ref isFalse,ref missing,ref missing);
}
结论
因此,我建议如果您发现自己需要使用 MS Office 自动化,但又不确定如何执行所需的操作,请在执行操作时录制一个宏,然后查看宏代码。很有可能宏代码会为您指向您需要编写的代码的方向。