Visual Studio 2010特性支持Office
4. 将Excel表格嵌入Word文档
Excel表格填充完成后,我们将这个表格嵌入到Word文档中。在主函数Main()的末尾添加如下代码,它将创建一个空的Word文档,然后通过调用函数PasteSpecial(),将Excel表格以链接的形式粘贴到Woed文档中:
var word = new Word.Application();
word.Visible = true;
word.Documents.Add();
word.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
这里需要说明的是,PasteSpecial()函数实际上有7个参数,这些参数都是可选的。如果是在C# 3.0中,我们必须全部给定这7个参数,不管这些参数是否真正需要。在C# 3.0中,PasteSpecial()函数的调用应该是这个样子:
// C# 3.0 code. Not necessary in C# 4.0!
object iconIndex = System.Reflection.Missing.Value;
object link = true;
object placement = System.Reflection.Missing.Value;
object displayAsIcon = true;
object dataType = System.Reflection.Missing.Value;
object iconFileName = System.Reflection.Missing.Value;
object iconLabel = System.Reflection.Missing.Value;
word.Selection.PasteSpecial(ref iconIndex,
ref link,
ref placement,
ref displayAsIcon,
ref dataType,
ref iconFileName,
ref iconLabel);
而在C# 4.0中,因为它支持了可选参数,使得原来需要15行代码才能完成的工作,现在只需要一行代码。大象减肥了!
5. 运行解决方案
到此为止,我们就完成了所有的开发工作,按下F5,运行整个解决方案,我们应该可以看到如下的运行结果:
图3 运行结果
6. No-PIA部署
开发完成后,最后的任务就是将应用程序部署到目标机器上。在以前的Office开发中,我们除了需要在目标机器上部署我们的应用程序之外,还需要部署一大堆应用程序运行必需的互操作程序集,这使得Office应用开发起来困难,想用起来也不简单。
为了让大家理解Office应用程序对Office互操作程序集的依赖,我们可以使用IL DASM工具查看应用程序所引用的程序集。通过在Visual Studio命令行工具(Visual Studio command prompt)中执行ildasm命令,我们可以运行IL DASM工具,然后打开我们刚刚开发的应用程序OfficeDev.exe,可以看到如下的界面:
图4 使用IL DASM查看应用程序
双击其中的“Manifest”,我们可以在弹出的窗口中看到应用程序对Microsoft.Office.Interop.Excel和Microsoft.Office.Interop.Word的引用:
图5 应用程序所依赖的程序集
这意味着如果想让我们的Office应用程序在目标机器上运行,目标机器上必需具有相应的程序集。这使得我们开发的Office应用程序,成为一头不折不扣的大象!
但是在Visual Studio 2010中,我们可以通过将程序用到的程序集嵌入到应用程序中,为大象减减肥,从而实现No-PIA部署。在解决方案浏览器中,我们修改相应程序集的属性,使得“Embed Interop Types”的值为True:
图6 修改程序集的属性
这样,我们就可以将我们真正使用到的程序集嵌入到应用程序中,从而不会对Excel或者Word的整个互操作程序集产生依赖。当我们再次使用IL DASM查看我们重新编译的OfficeDev.exe时,已经找不到对Microsoft.Office.Interop.Excel和Microsoft.Office.Interop.Word的依赖了:
图7 “大象瘦了!”
相反的,我们可以在IL DASM中看到,我们真正所使用到的Excel.Application, Excel.Range等类型已经嵌入到应用程序中了:
图8 嵌入到应用程序中的新类型
现在,我们就可以轻松地把应用程序部署到目标机器上,而不用去考虑目标机器上是否安装了Office,Office的版本是多少等等繁琐的问题。