LightSwitch办公集成包扩展的乐趣

[原文发表地址] Fun with the Office Integration Pack Extension for LightSwitch

[原文发表时间] 2011-09-22 07:43

上周Grid Logic发布了一款免费的LightSwitch扩展,叫做Office Integration Pack,迅速跃居VS Gallery LightSwitch最受欢迎的扩展第二位!它能让你用数据填充文档和电子表格,用Outlook创建邮件和预约,从Excel导入数据,创建PDF以及你LightSwitch桌面应用的其他东西。大家都知道我做过一些办公开发,所以我想亲自试试这个扩展。在这篇博文中,我会给你一些关于向Excel和Word导出数据的建议。

安装Office Integration Pack

首先你要做的就是安装Office Integration Pack。你会想下载样本应用和文档的。(顺便提一句,这里还免费提供源代码!)你可以直接通过Visual Studio LightSwitch中的Extension Manager 下载安装Office Integration Pack,或者你也可以手动从Visual Studio Gallery下载

image

安装了扩展之后,重启Visual Studio。然后你要通过打开项目属性,点击Extensions标签,然后选中Office Integration Pack来启动LightSwitch项目上的扩展

clip_image002[5]

现在我们来看看这个小东西能做什么。

输出到Excel

LightSwitch在数据网格上有一个很好的功能,那就是可以让你将数据导出到Excel:

image

这让用户可以方便地从系统中调取数据,创建报告或者用Excel对数据做进一步的分析。不过,你不能用自己的代码来调用这个功能。Office Integration Pack里很好的一点就是它不仅支持用代码来调用导出功能,还可以添加一系列自定义。你可以精确控制导出哪些字段,还可以具体化数据输出到哪个工作表中。

比如说我在搜索屏幕(如上图所示)中有一列客户,我希望创建自己的输出,只输出CompanyName, ContactName, ContactTitle 和Phone这些字段。首先在屏幕设计器中,在数据网格的命令栏中添加一个按钮,我把它命名为ExportToExcel。

clip_image002[9]

在属性窗口,你可以为这个按钮添加一个你喜欢的图标。我们还可以取消默认的Excel输出,步骤是选择Customers Data Grid,并在属性窗口选中“Disable Export to Excel”。

clip_image002[11]

现在我们就要写些代码来实现输出我们所需要的字段了。右击Export to Excel按钮,选择“Edit Execute Code”。我们可以用多种OfficeInetgration.Excel.Export API来实现。我学习一个新的API方法通常是通过智能感应,所以如果我们起始输入“OfficeIntegration (dot) Excel (dot)”,你会看到一系列可用的函数:

clip_image002[14]

Export函数有四个重载。第一个也是最简单的就是获取数据集合,输出所有数据和字段到一个新的工作簿中,就和内置Excel输出一样。第二个重载则让我们指定一个具体的工作簿,工作表和范围。在我们的例子中,我们也是想要指定的字段,这可以有多种方法来实现。第三个和第四个重载方法让我们可以指定一个ColumnNames参数,这个有两种形式。一个是简单的List(Of String)。只需用你向列表中填写你想输出的字段名就可以了。

 Private Sub ExportToExcel_Execute()
 Dim ExcelFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Customers.xlsx"

 If File.Exists(ExcelFile) Then
 Dim fields As New List(Of String) From
 {"CompanyName", "ContactName", "ContactTitle", "Phone"}

 OfficeIntegration.Excel.Export(Me.Customers, ExcelFile, "Sheet1", "A1", fields)
 End If
End Sub

还有一种方法就是指定一个List(Of OfficeIntegration.ColumnMappings)。ColumnMappings类在许多API中都有使用,尤其是Import函数中,你可以指定工作簿中的栏和实体上的属性,以便映射。在Export案例中,这不是必须的,我所需要做的就是指定我想要输出的实体上的属性(字段)。

现在我们运行应用程序,点击输出按钮,我们会看到输出到Excel的就只有我们指定的字段了。

image

输出到Word

我们还可以输出数据到Word上。你有许多种方法做到这点。一个叫做GenerateDocument,可以让你定义一个Content Controls模板,数据将会被导出至此。Content Controls是在Word文档内部捕捉数据的很好的方法。我们先创建一个Word文档,里面记录所有客户的订单。首先我会为我的客户创建一个Details Screen,同时选中Customer Orders为数据源。这就会创建一对多的屏幕,含有客户的详情和包含他们订单信息表格。

image

然后,我会在屏幕上添加一个按钮,这次是在顶端的屏幕命令栏中,命名为“Generate Document”。

clip_image002[20]

然后我们需要在Word中创建模板,添加内容控制,使之能包含我们客户实体中的数据。首先启动Word中的Developer标签(File –> Options –> Customize Ribbon,然后选中使“Developer”标签可用)。在模板上显示简单的文本控制,根据自己的喜好进行布局。然后点击属性命名控制。你可以随意命名你的内容控制。之后我们会在内容控制标题和用户属性之间指定ColumnMapping。

clip_image002[22]

我们还要在这个文档中创建一个相关顺序的表格。创建表格就要在Word中创建一个表格,然后进行书签设置。你可以选择手动创建列标题,或者你也可以让Office Integration Pack帮你自动生成。我会创建一个格式很好的表格,会有两行,在第一行有我自己的栏标题。然后我会对它进行标记“OrderTable”。

clip_image002[24]

最后我们要为第一次调用GenerateDocument编写一些代码,来构成我们的内容控件,然后为ExportEntityCollection创建一个调用来输出相关的订单集合到标记过的表中。我还通过调用SaveAsPDF函数生成了一个PDF文件。在屏幕上右击GenerateDocument命令,选择“Edit Execute Code”,然后编写如下内容:

 Private Sub GenerateDocument_Execute()

 Dim MyDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
 Dim WordFile = MyDocs & "\Customer.docx"

 If File.Exists(WordFile) Then

 'Map the content control tag names in the word document to the entity field names
 Dim custFields As New List(Of OfficeIntegration.ColumnMapping)
 custFields.Add(New OfficeIntegration.ColumnMapping("ContactName", "ContactName"))
 custFields.Add(New OfficeIntegration.ColumnMapping("CompanyName", "CompanyName"))
 custFields.Add(New OfficeIntegration.ColumnMapping("Phone", "Phone"))

 Dim doc As Object = OfficeIntegration.Word.GenerateDocument(WordFile, 
 Me.Customer, custFields)

 'Export specific fields to the bookmarked "OrderTable" in Word
 Dim orderFields As New List(Of String) From
 {"ShipName", "OrderDate", "ShippedDate"}

 OfficeIntegration.Word.ExportEntityCollection(doc, "OrderTable", 2, False, 
 Me.Customer.Orders, orderFields)
        
 OfficeIntegration.Word.SaveAsPDF(doc, MyDocs & "\Customer.pdf", True)
 End If
End Sub

你运行时,最终会在屏幕上显示一个Word文档和一个PDF文件,上面有我们排好格式的数据!

image

注意这里很多方法都会返回文档(或者工作书)自动化对象,所以你可以创建一些额外的后期绑定的COM调用,来实现你希望Office帮你自动做的。如果你想试试,可以参见这里的ExcelWordCOM开发者相关的内容。

希望你们用Office Integration Pack很愉快。

Grid Logic谢谢你!

希望你们喜欢!