收藏 分享(赏)

Visual Studio 2010系列之 特性支持Office.doc

上传人:scg750829 文档编号:7134030 上传时间:2019-05-06 格式:DOC 页数:9 大小:546KB
下载 相关 举报
Visual Studio 2010系列之 特性支持Office.doc_第1页
第1页 / 共9页
Visual Studio 2010系列之 特性支持Office.doc_第2页
第2页 / 共9页
Visual Studio 2010系列之 特性支持Office.doc_第3页
第3页 / 共9页
Visual Studio 2010系列之 特性支持Office.doc_第4页
第4页 / 共9页
Visual Studio 2010系列之 特性支持Office.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、Visual Studio 2010系列之 特性支持 Office一位漂亮的 OL把 Word当做文字处理软件来使用,这无可厚非;但是如果一位帅气的Developer也仅仅把 Word当做文字处理软件来使用,恐怕会被同行耻笑。在程序员的眼中,Office 不仅仅是一套非常流行的办公软件,更是一个成熟的开发平台。Office 的应用是如此广泛,几乎深入到企业信息化和个人文档处理的每个角落。通过 Office开发,可以帮助企业或者个人完成很多重复性的工作,规律性的工作甚至创造性的工作,正是因为如此,Office 开发在软件开发中显得越来越重要,已经成为商业软件开发的一个重要领域。为了支持 Offi

2、ce开发,无论是从上层的二次开发语言 VBA,还是底层的 Office开发工具 VSTO(Visual Studio Tools for Office),微软都给予了大力的支持。我们这里按下 VBA不表,单说这 Visual Studio 2010 CTP中新特性对 Office开发的支持。 有道是“樱桃好吃树难栽,Office 好用开发难” 。做过 Office开发的程序员常常会有这样的抱怨:“这个垃圾 C#,连个可选参数都不支持!”“COM接口太复杂繁琐啦,我都快被折磨死了!”“告诉客户,他的机器上必须也安装 Office 2003!Office 2007不支持!”这是因为 Office整

3、个系统本身非常庞杂,Office 对象模型难于全部掌握,开发语言对 Office开发支持不够等等,这些都使得 Office开发就像一头笨重的大象,虽然稳定,但是行动却有些迟缓,开发效率不高。不过这些抱怨很快就会成为历史了。在 Visual Studio 2010 CTP中,它提供了很多新的特性,来解决上述的这些 Office开发中的主要问题,以更好地支持 Office开发。当然,这些特性也可以应用在其他场合。这些新的特性包括: 动态编程在前面的文章中我们曾经介绍过,C# 4.0中引入了一种新的静态类型 dynamic,这使得我们在使用 COM进行 Office开发的时候,无需再进行复杂而繁琐的

4、对象类型转换。 可选参数Office提供的函数往往有很多参数,在大多数情况下,很多参数使用默认值就可以了,无需全部指定。但是在 C# 3.0中,因为它不支持可选参数,导致每次调用函数都必须给定全部参数,代码繁琐而臃肿。C# 4.0通过对可选参数的支持,很好地解决了这一问题。 No-PIA部署以前的 Office开发,都要求目标机器(用户机器)上同样安装了 Office,有时甚至对Office的版本还有特殊的要求。这给 Office程序的部署带来了极大的困难:目标机器千差万别,有的安装了 Office,有的没有安装,安装了 Office的机器,Office 版本又各不相同。在 Visual St

5、udio 2010中,因为有了 No-PIA部署的支持,这些问题都得到了很好的解决。有了上述特性的支持,Visual Studio 2010中 Office开发开始变得简洁而自然。为了让大家有更加深刻的体会,下面我们以一个实际的例子,来看看这些新特性是如何更好地支持 Office开发的。在这个例子中,我们将创建一个表示银行账号的类,然后用这个类的数据填充一个 Excel表格,最后将这个表格嵌入到一个 Word文档中。(这里需要说明的是,虽然有了 No-PIA部署的支持,目标机器上无需安装 Office,但是开发机器上还是需要安装 Office的。)1. 创建 Office开发项目 Office

6、Dev 启动 Visual Studio 2010 CTP,我们创建一个基于 Visual C#的控制台应用程序(Console Application),同时确保目标平台是“.NET Framework 4.0”:图1 创建 Office开发项目要使用托管代码调用 Office 应用程序功能,必须使用互操作程序集。互操作程序集使托管代码可以与 Office 应用程序的基于 COM 的对象模型进行交互。所以在项目创建完成后,为了进行 Office开发,我们需要在项目中添加 Office互操作程序集的引用。在解决方案浏览器(Solution Explorer)中的项目节点上,我们单击右键,在弹出

7、的上下文菜单中我们选择“添加引用(Add Reference)” 。在弹出的对话框中,我们选中.NET标签页中的 Microsoft.Office.Interop.Excel, version 12.0和Microsoft.Office.Interop.Word, version 12.0,单击“OK”将它们添加到刚刚创建的项目 OfficeDev中。 图2 添加互操作程序集2. 创建和准备银行账号类 Account 在 OfficeDev项目中,我们新建一个类Account,用来表示银行账号。我们将这个类实现如下:public class Account public string Name

8、 get; set; public double Balance get; set; 这里需要注意的是,为了简化后面的流程,我们没有将这个类定义在任何名字空间内。接下来,为了进行 Office开发,我们需要在代码中引入 Office开发相关的名字空间。在 Program.cs中添加如下代码以引入相应的名字空间:using Microsoft.Office.Interop; using Excel = Microsoft.Office.Interop.Excel;using Word = Microsoft.Office.Interop.Word;最后,我们用数据初始化 Account类的对象,

9、并将它们添加到容器中,以备后用。在主函数 Main()中添加如下代码:var checkAccounts = new List new Account Name = “陈良乔”,Balance = 541.27,new Account Name = “贾玮”,Balance = -127.44;这里我们用账号数据新创建了两个 Account对象,并将它们添加到 List容器checkAccounts中。3. 在 Excel中显示账号数据上一步我们完成了数据的准备,下面我们将把这些数据显示到 Excel表格中。我们定义一个 DisplayInExcel()函数用于创建 Excel表格,然后将容器

10、中的账号数据填充到Excel表格中:public static void DisplayInExcel(IEnumerable accounts, Action DisplayFunc) var xl = new Excel.Application();xl.Workbooks.Add();xl.Visible = true;xl.Cells1, 1.Value2 = “Name“;xl.Cells1, 2.Value2 = “ Balance“;xl.Cells2, 1.Select(); foreach (var ac in accounts) DisplayFunc(ac, xl.Act

11、iveCell);xl.ActiveCell.get_Offset(1, 0).Select();xl.get_Range(“A1:B3“).Copy();然后,我们在 Main()函数的底部,按照如下的方式调用 DisplayInExcel()函数,最终完成 Excel表格的创建和数据的填充:DisplayInExcel(checkAccounts, (account, cell) = / This multiline lambda will set / custom processing rules. cell.Value2=account.Name;cell.get_Offset(0,

12、1).Value2 = account.Balance; if (account.Balance 0)cell.Interior.Color = 255;cell.get_Offset(0, 1).Interior.Color = 255;);这里我们使用了 Lambda表达式,由它来对数据填充的逻辑进行具体的定义,最终完成数据的填充。同时,它还会检查 Balance的值,如果为负值,则将表格填充为红色,表示这个账号已经赤字了。最后,为了使得 Excel表格更加美观,我们让 Excel表格根据内容自动调整表格的宽度。在 DisplayInExcel()函数的末尾,我们添加如下的代码:xl.Co

13、lumns1.AutoFit();xl.Columns2.AutoFit();在这里,有过 Office开发经验的朋友可能会感到奇怪,AutoFit()函数可以被Columns的返回结果直接调用而无需进行类型转换吗?的确,在 C# 3.0中,要想调用AutoFit()函数,必须对 Columns的返回值进行类型转换,上面的代码应该写成:/ C# 3.0 code. Not necessary in C# 4.0!(Range)xl.Columns1).AutoFit();(Range)xl.Columns2).AutoFit();但是在 C# 4.0中,因为有了 dynamic类型的支持,繁琐

14、的类型转换将不再需要。在C# 4.0中,从 COM接口返回的 Object类型的对象,被自动当做 dynamic类型来处理。我们前面曾经介绍过,因为动态类型的迟绑定特性(late binding),dynamic 类型可以调用任何函数,所以无需再进行类型转换,也不会产生编译错误。在运行的时候,动态语言运行时(DLR)会动态查找对象真正的类型而调用相应的函数。4. 将 Excel表格嵌入 Word文档 Excel表格填充完成后,我们将这个表格嵌入到Word文档中。在主函数 Main()的末尾添加如下代码,它将创建一个空的 Word文档,然后通过调用函数 PasteSpecial(),将 Exce

15、l表格以链接的形式粘贴到 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 nec

16、essary 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.Refl

17、ection.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部署 开发完成后,最后的

18、任务就是将应用程序部署到目标机器上。在以前的 Office开发中,我们除了需要在目标机器上部署我们的应用程序之外,还需要部署一大堆应用程序运行必需的互操作程序集,这使得 Office应用开发起来困难,想用起来也不简单。为了让大家理解 Office应用程序对 Office互操作程序集的依赖,我们可以使用 IL DASM工具查看应用程序所引用的程序集。通过在 Visual Studio命令行工具(Visual Studio command prompt)中执行 ildasm命令,我们可以运行 IL DASM工具,然后打开我们刚刚开发的应用程序 OfficeDev.exe,可以看到如下的界面:图4

19、使用 IL DASM查看应用程序双击其中的“Manifest” ,我们可以在弹出的窗口中看到应用程序对Microsoft.Office.Interop.Excel和 Microsoft.Office.Interop.Word的引用:图5 应用程序所依赖的程序集这意味着如果想让我们的 Office应用程序在目标机器上运行,目标机器上必需具有相应的程序集。这使得我们开发的 Office应用程序,成为一头不折不扣的大象!但是在 Visual Studio 2010中,我们可以通过将程序用到的程序集嵌入到应用程序中,为大象减减肥,从而实现 No-PIA部署。在解决方案浏览器中,我们修改相应程序集的属性

20、,使得“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 的版本是多少等等繁琐的问题。“老婆快来看啊,有头大象在跳舞耶!”

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报