** 在 ** ** Office ** ** 文档中使用 ** ** DataSet ** ** 中的数据 ** ** **
一旦 ** DataSet ** 中填充完毕你所需要的数据 , 并且断开了数据库连接 , 你就有多种方法在各种 Office 文档中使用这些数据。 Microsoft Office System 本质上不能处理大多数基于 .NET 的对象,因此,通常你必须使用 COM 互用性( COM interoperability )来维护这些数据,并将这些数据转换为你希望添入的工作表或其他文档所能识别的数据类型。 你可以在 Microsoft Office System 使用它新集成的XML功能来达到这种与.NET对象的综合应用。
** 将数据插入工作表 ** ** **
你可能使用过VBA,那么你可以采用你在VBA中使用的那些技术相类似的方式使用VB.NET自动创建一个新的工作表。当然,如果你熟悉从外部应用程序自动创建工作表的技术,那么你完全可以使用与之完全相同的技术来自动创建一个工作表 —— 比如那些使用 Microsoft Visual Basic 6 编写的代码。然后,你需要将 DataSet 中的内容插入到工作表中。
一个 Windows 窗体可以使用定制的 ** BuildWorksheet ** 方法打开 Microsoft Office Excel 2003, 添加一个工作簿 , 并使用适当的数据创建一个工作表。 图2显示了这个结果。不幸的是,在Excel中没有一个属性你可以分派 ** DataSet ** 的引用给它 —— ** DataGrid ** 窗口和 Web 窗体控件就有这种属性。 因此,你必须编写一些代码来完成这个任务。
** 图 ** ** 2 ** ** 已经用 ** ** DataSet ** ** 中的数据填充了的 ** ** Excel 2003 ** ** 工作表 **
Microsoft Office System 通过 COM 对象公布各个对象。 因此微软发布了一套 Primary Interop Assemblies ( 主互操作程序集 , PIAs) , 它专门针对 .NET 对象访问 COM 对象进行了优化。 你必须在每台客户机上安装 PIAs ,而实际上,当安装 Microsoft Office System 时就安装了它们。
当安装 Microsoft Office System 时 , 在安装向导中选择用户自定义选项 , 如下面的图 3 所示 , 你可以选择或清除那些功能。其中的“支持 .NET 编程”选项就是指安装 PIAs 。 你必须为每个你计划与之自动互操作的.NET兼容的应用程序安装PIAs,并且你既可以将PIAs安装到全局程序集缓存(GAC)中,也可以将PIAs放置在你的项目文件夹。你可以从下面的文章中找到其它更详细的信息: How to: Install Office Primary Interop Assemblies .
** 图 ** ** 3 ** ** 使用向导安装 ** ** PIAs **
当在基于 .NET 的应用程序中使用 Excel 2003 PIAs , 需要在 Visual Studio .NET 的 “ 添加引用 ” 对话框中添加对它们的引用 , 如图 4 所示。一旦尼添加了这个引用,你就可以象维护 .NET 程序集一样维护 Excel COM 对象。
** 图 ** ** 4 ** ** 使用 ** ** “ ** ** 添加引用 ** ** ” ** ** 对话框添加对 ** ** Excel 2003 PIAs ** ** 的引用 **
** 在这个 ** ADONET.vb ** ** Windows 窗体中 ** BuildWorksheet ** 被定义成一个私有过程 , 它有且只有一个 ** DataSet ** 参数。 因为它实际上仅仅处理一个 ** DataTable ** 对象(存储客户数据),代码在开头处声明了一个名为 dt 的 DataTable 变量,用以保存对该表的引用。
Private Sub BuildWorksheet(ByVal ds As DataSet)
Dim dt As DataTable
为了维护 Excel 工作簿 , 需要实例化一个 Excel 应用程序对象 , 然后使用该对象模型添加一个新的工作簿 , 并更改工作簿的名字 ( 例子中采用的是 Northwind Customers ), 同时执行了其它 UI 方面的任务。
'Create an instance of Excel 2003, add a workbook,
'and let the user know what's happening
Dim xl As New Excel.Application
xl.Workbooks.Add()
xl.ActiveSheet.Name = "Northwind Customers"
xl.Visible = True
xl.Range("A1").Value = "Loading the DataSet...."
一旦加载并运行 Excel , 这段代码需要引用 ** DataSet ** ds 中的相应表 ( ** DataTable ** ** 对象 ** ) 。 然后它遍历 ** DataTable ** 对象 的列集合,将各个字段名写到工作表的首行。该示例使用 Customers 表和 Customers 列标题。
Try
xl.ScreenUpdating = False
'Start with the Customers table
dt = ds.Tables("Customers")
'Add the column headings for the Customers
Dim dc As DataColumn
Dim iCols As Int32 = 0
For Each dc In dt.Columns
xl.Range("A1").Offset(0, iCols).Value = dc.ColumnName
iCols += 1
Next
所有剩下的工作就是遍历表的所有行 , 使用 ** DataRow ** 对象的 ** ItemArray ** 属性来将每个数据行的内容写到工作表的一行中。 这大约是 Excel 将要直接支持 ** DataSet ** 对象最显著的征兆。
'Add the data
Dim iRows As Int32
For iRows = 0 To dt.Rows.Count - 1
xl.Range("A2").Offset(iRows).Resize(1, iCols).Value = _
dt.Rows(iRows).ItemArray()
Next
Catch ex As Exception
这个过程中其余的代码更新 UI , 并对工作表应用内建的格式化。
Finally
xl.ScreenUpdating = True
End Try
'Make the sheet pretty
With xl.ActiveSheet.Range("A1")
.AutoFilter()
.AutoFormat(Excel.XlRangeAutoFormat.xlRangeAutoFormatSimple)
End With
xl = Nothing
End Sub
尽管 Microsoft Office System 本质上不支持 .NET 对象 , 但是 ** DataSet ** 的对象模型和功能使得将其结合到 Microsoft Office System 中 , 实现数据交互任务非常简单。
注意 : 你可以放心使用这个技术 , 而不用担心 ** DataSet ** 来自何处 , 它甚至可以来自于 .NET 组件或 Web 服务。