LightSwitch 办公集成扩展包的乐趣

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

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

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

安装办公集成包

首先你要做的就是安装这个办公集成包。你还可以下载应用程序示例和文档。(顺便提一句,这里还免费提供源代码!)你可以直接通过Visual Studio LightSwitch中的扩展管理器下载安装办公集成包,或者你也可以手动从Visual Studio Gallery下载

image

安装了扩展之后,重启Visual Studio。然后你要通过打开项目属性,点击扩展标签,选择办公集成包来使得你的LightSwitch项目上启用扩展

image

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

导出到Excel

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

image

它提供给用户一种基本的方法:从系统中调取数据,创建报告或者用Excel对数据做进一步的分析。不过,你不能用自己的代码来调用这个功能。办公集成包里很好的一个功能就是它不仅支持用代码来调用导出,还可以为它添加一系列自定义处理。你可以控制导出哪些字段,还可以指定导出数据到哪个工作表中。

比如说在我的搜索屏幕(如上图所示)中有一列客户,我希望创建自己的输出,只导出CompanyName, ContactName, ContactTitle 和Phone这些内容。在屏幕设计器中先添加一个按钮到Data Grid的命令栏,我把它叫做ExportToExcel。

image

在属性窗口,你可以指定一张图片来显示你想显示的东西。我们还可以在网格中通过选择Customer Data Grid来关掉默认的Excel导出,,并在属性窗口选择“Disable Export to Excel”。

image

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

image

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

  1: Private Sub ExportToExcel_Execute()
  2:  Dim ExcelFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Customers.xlsx"
  3:  
  4:     If File.Exists(ExcelFile) Then
  5:         Dim fields As New List(Of String) From
  6:             {"CompanyName", "ContactName", "ContactTitle", "Phone"}
  7:  
  8:         OfficeIntegration.Excel.Export(Me.Customers, ExcelFile, "Sheet1", "A1", fields)
  9:     End If
  10: End Sub

还有一种方法就是指定这个List(Of OfficeIntegration.ColumnMappings)。ColumnMappings类在许多API中都有使用,尤其是导入方法中,你可以指定Excel的列和这些实体的属性,以便映射。在导出方法中,这些不是必须的,我所需要做的就是指定想要输出的实体的属性(字段)。

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

image

导出到Word

我们还可以导出数据到Word中。你有许多种方法可以做到这点。一种叫做GenerateDocument,它可以让你定义一个content控件模板,来导出数据。content控件是在Word文档内捕捉数据的很好的方法。我们先创建一个Word文档,里面有客户的所有订单信息。首先我会为我的客户创建一个Details Screen,并且选择包含客户订单。这就会创建一对多的屏幕,含有客户详情和一组他们的订单信息。

image

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

image

然后我们需要在Word中创建模板,添加content控件,使之能包含我们客户实体中的数据。首先启动Word中的Developer标签(file →options→customize,然后选择启用“developer”标签)。在模板上显示简单的文本控件,根据自己的喜好进行布局。然后点击属性来给控件命名。你可以随意命名你的content控件。之后我们会在控件标题和自定义属性之间指定ColumnMapping。

image

我们还要在这个文档中创建一个相关订单的表格。为了创建表格,你需要在Word中创建一个表格,并对它进行书签设置。你可以选择性地手动创建列标头,或者你也可以让办公集成包为你自动生成。我会创建一个格式很好的表格,它有两行,在第一行有我自己的列标头。然后我会对它设置书签“OrderTable”。

image

最后我们需要写些代码,首先要调用GenerateDocument来填充我们的内容控件,然后调用ExportEntityCollection来导出相关订单集合到标记过书签的表中。我还通过调用SaveAsPDF方法生成了一个PDF。在屏幕上右击GenerateDocument命令,选择“Edit Execute code”,然后编写如下内容:

  1: Private Sub GenerateDocument_Execute()
  2:  
  3:     Dim MyDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
  4:     Dim WordFile = MyDocs & "\Customer.docx"
  5:  
  6:     If File.Exists(WordFile) Then
  7:  
  8:         'Map the content control tag names in the word document to the entity field names
  9:         Dim custFields As New List(Of OfficeIntegration.ColumnMapping)
  10:         custFields.Add(New OfficeIntegration.ColumnMapping("ContactName", "ContactName"))
  11:         custFields.Add(New OfficeIntegration.ColumnMapping("CompanyName", "CompanyName"))
  12:         custFields.Add(New OfficeIntegration.ColumnMapping("Phone", "Phone"))
  13:  
  14:         Dim doc As Object = OfficeIntegration.Word.GenerateDocument(WordFile,                                                                     Me.Customer, custFields)
  15:  
  16:         'Export specific fields to the bookmarked "OrderTable" in Word
  17:         Dim orderFields As New List(Of String) From
  18:             {"ShipName", "OrderDate", "ShippedDate"}
  19:  
  20:         OfficeIntegration.Word.ExportEntityCollection(doc, "OrderTable", 2, False,                                                       Me.Customer.Orders, orderFields)
  21:                 OfficeIntegration.Word.SaveAsPDF(doc, MyDocs & "\Customer.pdf", True)
  22:     End If
  23: End Sub

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

image

注意这里有很多方法都会返回文档(Excel)自动对象,所以你可以创建一些额外的延迟绑定COM调用来实现你希望的Office自动化。如果你想试试,可以参考这里的ExcelWordCOM开发者相关信息。

希望你们使用愉快。

Grid Logic谢谢你!

希望你们喜欢!