如何在 Visual Basic .NET 中使用 ADO.NET 检索和修改 Excel 工作簿中的记录
文章编号 | : | 316934 |
最后修改 | : | 2004年6月29日 |
修订 | : | 7.0 |
概要
本文讨论如何使用 ADO.NET 检索 Microsoft Excel 工作簿中的数据、修改现有工作簿中的数据或将数据添加至新的工作簿中。要通过 ADO.NET 访问 Excel 工作簿,您可以使用 Jet OLE DB 提供程序;本文提供了您所需要的信息,以便您可以在 Excel 充当目标数据源时使用 Jet OLE DB 提供程序。
使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO。如果您在连接字符串中指定 HDR=NO,Jet OLE DB 提供程序将自动为您命名字段(F1 表示第一个字段,F2 表示第二个字段,依此类推)。
表命名规则 您可以通过若干种方式引用 Excel 工作簿中的表(或区域):
注意:工作表名称后面带美元符号表示该表存在。如果您要创建一个新表,如本文 创建新工作簿和表 一节中所讨论的那样,请不要使用美元符号。
Dataset 是一个从数据源检索到的记录的缓存。Dataset 中的数据通常要比数据库中的数据精简得多。但是,您可以像使用实际数据一样使用它,并且无须与实际数据库连接。除了数据检索之外,还可以使用 Dataset 在基础数据库上执行更新操作。
或者,您可以使用 DataReader 从数据库中检索只读、只进数据流。当您使用 DataReader 程序时,由于内存中每次仅有一行,因此性能将增强,系统开销将降低。如果您有大量数据需要检索并且不希望更改基础数据库,则 DataReader 是比 Dataset 更好的选择。
添加和更新记录 使用 ADO.NET,您可以通过三种方式之一在工作簿中插入和更新记录:
本文的稍后的示例代码 部分对这些在工作簿中添加和更新记录的方法中的每一种都进行了说明。
本文的 示例代码 部分说明了如何使用 CREATE TABLE 命令创建新的工作簿和表。
以下过程说明了如何通过示例代码在工作簿中使用格式设置:
如何将 Jet OLE DB 提供程序与 Microsoft Excel 工作簿配合使用
Microsoft Jet 数据库引擎可以通过可安装的索引顺序访问方法 (ISAM) 驱动程序,访问格式为其他数据库文件(例如 Excel 工作簿)的数据。要打开 Microsoft Jet 4.0 OLE DB 提供程序所支持的外部格式,请在连接的扩展属性中指定数据库类型。Jet OLE DB 提供程序对于 Microsoft Excel 工作簿支持下列数据库类型:Excel 3.0
Excel 4.0
Excel 5.0
Excel 8.0
注意:对于 Microsoft Excel 5.0 和 7.0 (95) 工作簿,请使用 Excel 5.0 源数据库类型;对于 Microsoft Excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,请使用 Excel 8.0 源数据库类型。本文中的示例使用的是格式为 Excel 2000 和 Excel 2002 的 Excel 工作簿。 Excel 4.0
Excel 5.0
Excel 8.0
连接字符串
要使用 Jet OLE DB 提供程序访问 Excel 工作簿,请使用具有下列语法的连接字符串:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES;"
在连接字符串中,用 Data Source 参数指定工作簿的完整路径和文件名。Extended Properties 参数可包含两种属性:一个属性用于 ISAM 版本,一个属性用于指示表是否包括标题。使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO。如果您在连接字符串中指定 HDR=NO,Jet OLE DB 提供程序将自动为您命名字段(F1 表示第一个字段,F2 表示第二个字段,依此类推)。
数据类型
与传统的数据库不同,在 Excel 表中没有指定列的数据类型的直接方式。而是,OLE DB 提供程序通过对一列中的八行进行扫描来猜测 该字段的数据类型。您可以通过为连接字符串的扩展属性中的 MAXSCANROWS 设置指定一个一 (1) 至十六 (16) 之间的值,来更改要扫描的行数。表命名规则 您可以通过若干种方式引用 Excel 工作簿中的表(或区域):
• | 使用工作表名称后面跟一个美元符号(例如 [Sheet1$] 或 [My Worksheet$])。以此方式引用的工作簿包括工作表的整个使用区域。
Select * from [Sheet1$]
|
• | 使用带有定义名称的区域(例如 [MyNamedRange]):
Select * from [MyNamedRange]
|
• | 使用带有特定地址的区域(例如 [Sheet1$A1:B10]):
Select * from [Sheet1$A1:B10]
|
如何将 Excel 工作簿用作 ADO.NET 数据源
检索记录
您可以使用 ADO.NET 中的两种方法之一检索数据库中的记录:使用 Dataset 或使用 DataReader。Dataset 是一个从数据源检索到的记录的缓存。Dataset 中的数据通常要比数据库中的数据精简得多。但是,您可以像使用实际数据一样使用它,并且无须与实际数据库连接。除了数据检索之外,还可以使用 Dataset 在基础数据库上执行更新操作。
或者,您可以使用 DataReader 从数据库中检索只读、只进数据流。当您使用 DataReader 程序时,由于内存中每次仅有一行,因此性能将增强,系统开销将降低。如果您有大量数据需要检索并且不希望更改基础数据库,则 DataReader 是比 Dataset 更好的选择。
添加和更新记录 使用 ADO.NET,您可以通过三种方式之一在工作簿中插入和更新记录:
• | 直接运行一个命令,每次插入或更新一个记录。为此,您可以在自己的连接上创建一个 OLEDbCommand 对象,并将其 CommandText 属性设置成一个插入记录的有效命令
或一个可更新记录的命令,
然后调用 ExecuteNonQuery 方法。 |
• | 对使用 Excel 工作簿中的一个表/查询填充的一个 DataSet 做一些更改,然后调用 DataAdapter 的 Update 方法,以将这些更改从 DataSet 解析回工作簿。不过,要使用 Update 方法执行更新解析,您必须为 DataAdapter 的 InsertCommand 设置参数化命令:
并为 UpdateCommand 设置参数化命令:
必须要用 INSERT 和 UPDATE 的参数化命令,因为 OleDbDataAdapter 不提供 Excel 工作簿的主键/索引信息;没有主键/索引字段,CommandBuilder 就无法自动为您生成命令。 |
• | 如果 Jet OLE DB 提供程序能够使用另外的数据源,请将该数据源中的数据导出到 Excel 工作簿中。可通过 Jet OLE DB 提供程序以这种方式使用的数据源包括:文本文件、Microsoft Access 数据库,当然也包括其他 Excel 工作簿。使用单个 INSERT INTO 命令,您可以将其他表/查询中的数据导出到您的工作簿中:
INSERT INTO 要求目标表(或工作表)已存在,并且数据已附加到目标表中。您还可以使用 SELECT..INTO 将您的表/查询导出到工作簿中:
当您使用 SELECT..INTO 时,如果目标表或工作簿不存在,将为您创建。如果在发出 SELECT..INTO 命令之前表已存在,您将收到错误信息。 |
本文的稍后的示例代码 部分对这些在工作簿中添加和更新记录的方法中的每一种都进行了说明。
删除记录
虽然 Jet OLE DB 提供程序允许您在 Excel 工作簿中插入和更新记录,但是不允许进行 DELETE(删除)操作。如果您尝试对一个或多个记录执行 DELETE 操作,您将收到以下错误信息:Deleting data in a linked table is not supported by this ISAM.
这是将 Excel 工作簿作为数据库进行处理时所固有的限制。创建工作簿和表
要在 Excel 工作簿中创建表,请运行 CREATE TABLE 命令:
CREATE TABLE Sheet1 (F1 char(255), F2 char(255))
当您运行此命令时,将使用您在命令中指定的表名称创建新的工作表。如果不存在要连接的工作簿,也会创建该工作簿。本文的 示例代码 部分说明了如何使用 CREATE TABLE 命令创建新的工作簿和表。
分步操作
示例代码
1. | 启动一个新的 Visual Basic .NET Windows 应用程序项目。 默认情况下会创建 Form1。 |
2. | 向 Form1 添加六个 RadioButton(单选按钮)控件和一个 Button(按钮)控件。 |
3. | 选中所有单选按钮控件,并将大小属性设置为 200,24。 |
4. | 在视图菜单上,单击代码。 |
5. | 在代码模块的开始处添加以下行:
|
6. | 将以下代码插入到Form 类中:
|
7. | 如果需要,可为代码中的 m_sNorthwind 成员修改指向 Access 示例数据库 Northwind 的路径。 |
试运行
1. | 在视图菜单上,指向其他窗口,然后单击输出以显示输出窗口。 |
2. | 按 F5 键生成并运行程序。 |
3. | 单击 Create_Workbook,然后单击 Go(执行。下同)。Create_Workbook 过程将运行 CREATE TABLE 命令以创建两个新的工作簿:C:\ExcelData1.xls 和 C:\ExcelData2.xls。ExcelData1.xls 包含一个名为 EmployeeData 的工作表(表),ExcelData2.xls 包含一个名为 InventoryData 的工作表(表)。这两个表都填入了记录。 注意:请在此测试的每个其余步骤中,在 Excel 中打开工作簿以检查结果。或者,单击 Retrieve_Records 以在 Visual Studio .NET 的输出窗口中查看表内容。 |
4. | 单击 Retrieve_Records,然后单击 Go。Retrieve_Records 过程将从表中提取记录并将它们显示在输出窗口中,输出的记录类似于下面的内容:
EmployeeData: ============= AAA Andrew 12/4/1955 InventoryData: ============== Cola 200 1.35 Chips 550 0.89 |
5. | 单击 Add_Records,然后单击 Go。Add_Records 例程将向每个表添加两条记录:
EmployeeData: ============= AAA Andrew 12/4/1955 CCC Charlie 10/14/1948 DDD Deloris 7/19/1998 InventoryData: ============== Cola 200 1.35 Chips 550 0.89 Bread 390 1.89 Milk 99 2.59 |
6. | 单击 Update_Records,然后单击 Go。Update_Records 例程在每一个工作簿中更新两条记录:
EmployeeData: ============= AAA Aaron 5/4/1975 CCC Charlie 10/14/1948 DDD Deloris 7/19/1998 InventoryData: ============== Cola 1000 10.1 Chips 2000 20.2 Bread 390 1.89 Milk 99 2.59 |
7. | 单击 Update_Individual_Cells,然后单击 Go。Update_Individual_Cells 例程修改 ExcelData1.xls 中 EmployeeData 工作表上的特定单元格;具体就是单元格 F3、G3 和 I4 将被更新。 |
8. | 单击 Use_External_Source,然后单击 Go。当您使用 INSERT..INTO 命令时,Use_External_Source 例程将 Northwind 表“Employees”中的记录追加到 ExcelData1.xls 中的 EmployeeData 工作表中。并且,Use_External_Source 使用 SELECT..INTO 命令在 ExcelData2.xls 中创建一个包含 Northwind 表“Products”中的所有记录的新表(或工作表)。 注意:如果您单击 Use_External_Source 多次,Employees 列表将被追加多次,原因是主键未被识别或实施。 |
单元格格式设置
如果您要使用 ADO.NET 在现有工作簿中添加或更新记录,可以将单元格格式应用到该工作簿,以将该格式应用于新的或已更新的记录。当您更新工作簿中的现有记录(或行)时,将保留单元格格式设置。当您在工作簿中插入新的记录(或行)时,新记录将继承上一行的格式设置。以下过程说明了如何通过示例代码在工作簿中使用格式设置:
1. | 按 F5 生成并运行该示例。 |
2. | 在 Form1 上,单击 Create_Workbook,然后单击 Go。 |
3. | 启动 Microsoft Excel 并打开 C:\ExcelData1.xls。 |
4. | 对单元格 A2 应用粗体样式。 |
5. | 对单元格 B2 应用斜体和下划线样式,并居中对齐。 |
6. | 对单元格 C2 应用长日期格式。 |
7. | 保存并关闭 C:\ExcelData1.xls。 |
8. | 在 Form1 上,单击 Add_Records,然后单击 Go。 |
9. | 在 Excel 中打开 C:\ExcelData1.xls,可以看到两个新行继承了第一行的格式设置。 |
限制
下面是 Jet OLE DB 提供程序关于 Excel 数据源的一些限制:• | 您不能使用 ADO.NET 在单元格中插入公式。 |
• | Jet OLE DB 提供程序无法为 Excel 工作簿中的表提供主键/索引信息。因此,您不能使用 CommandBuilder 在 Excel 工作簿中自动更新和插入记录。 |