OLEDB Excel 与C# 的数据流通方法
一、???????????? 名詞解釋:
它如同普通SQL數(shù)據(jù)庫(kù)一樣的操作。下面先簡(jiǎn)單的介紹一下SQL數(shù)據(jù)庫(kù)記錄操作的語(yǔ)句。
數(shù)據(jù)類型:與傳統(tǒng)的數(shù)據(jù)庫(kù)不同,在 Excel 表中沒(méi)有指定列的數(shù)據(jù)類型的直接方式。而是通過(guò)OLE DB 提供程序的程序,對(duì)一列中的八行進(jìn)行掃描來(lái)猜測(cè)該字段的數(shù)據(jù)類型。您可以通過(guò)為連接字符串的擴(kuò)展屬性中的 MAXSCANROWS 設(shè)置指定一個(gè)一 (1) 至十六 (16) 之間的值,來(lái)更改要掃描的行數(shù)。
查詢?????? select * from [表名$]
(1)使用帶有定義名稱的區(qū)域(例如 [MyNamedRange])
Select * from [MyNamedRange]
(2)使用帶有特定地址的區(qū)域(例如 [Sheet1$A1:B10]):
Select * from [Sheet1$A1:B10]
注意:工作表名稱后面帶美元符號(hào)表示該表存在。如果您要?jiǎng)?chuàng)建一個(gè)新表,如本文 創(chuàng)建新工作簿和表 一節(jié)中所討論的那樣,請(qǐng)不要使用美元符號(hào)。
//示例 OleDB方式的查詢語(yǔ)句??????
string selectString = "select * from [Sheet2$]";
//SQL方式
string selectString = "SELECT * FROM table1 WHERE 日期>=#" + this.dmBegin.ToString() + "# and 日期<=#" + this.dmEnd.ToString() + "#";
string strSearch = " SELECT * FROM table1 WHERE 日期LIKE '%" + dm.ToString() + "%' OR 地點(diǎn) LIKE '%" + this.textBox1.Text + "'";
?
插入?????? insert into [表名$] values ('值1’,’值2’,)
// 示例OleDB方式
string instertString = "insert into [Sheet2$](ID,X,Y,Z) values(" + OID + "," + x + "," + y + "," + z + ")";
//SQL方式??????
string strInst = "INSERT INTO table1(ColumnName1, ColumnName2, ColumnName3,…) VALUES (' " + this.textBox1.Text + " ',' " + this.textBox2.Text + " ',' " + this.textBox3.Text + " ',' " + …+ " ')";
刪除:
//SQL形式
string strDel = "DELETE * FROM table1 WHERE 日期= ' " +dm.ToString() + " ' ";??????????????????
更新:
//SQL形式
string strUpdate = "UPDATE table1 SET" + " 地點(diǎn)='" + this.textBox1.Text + "',人物='" + this.textBox6.Text + "'WHERE 日期='" + this.textBox5.Text + "'";
二、???????????? 具體的操作
本文討論如何使用 ADO.NET 檢索 Microsoft Excel 工作簿中的數(shù)據(jù)、修改現(xiàn)有工作簿中的數(shù)據(jù)或?qū)?shù)據(jù)添加至新的工作簿中。要通過(guò) ADO.NET 訪問(wèn) Excel 工作簿,您可以使用 Jet OLE DB 提供程序。
?
如何將 Jet OLE DB 提供程序與 Microsoft Excel 工作簿配合使用
Microsoft Jet 數(shù)據(jù)庫(kù)引擎可以通過(guò)可安裝的索引順序訪問(wèn)方法 (ISAM) 驅(qū)動(dòng)程序,訪問(wèn)格式為其他數(shù)據(jù)庫(kù)文件(例如 Excel 工作簿)的數(shù)據(jù)。要打開(kāi) Microsoft Jet 4.0 OLE DB 提供程序所支持的外部格式,請(qǐng)?jiān)谶B接的擴(kuò)展屬性中指定數(shù)據(jù)庫(kù)類型。Jet OLE DB 提供程序?qū)τ?Microsoft Excel 工作簿支持下列數(shù)據(jù)庫(kù)類型:Excel 3.0 、Excel 4.0 、Excel 5.0 、Excel 8.0 、…
注意:對(duì)于 Microsoft Excel 5.0 和 7.0 (95) 工作簿,請(qǐng)使用 Excel 5.0 源數(shù)據(jù)庫(kù)類型;對(duì)于 Microsoft Excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,請(qǐng)使用 Excel 8.0 源數(shù)據(jù)庫(kù)類型。本文中的示例使用的是格式為 Excel 2000 和 Excel 2002 的 Excel 工作簿。
?
?
1、連接字符串
要使用 Jet OLE DB 提供程序訪問(wèn) Excel 工作簿,請(qǐng)使用具有下列語(yǔ)法的連接字符串:
string Provider=” Microsoft.Jet.OLEDB.4.0; ??Data Source=C:/Book1.xls; ??Extended Properties=’Excel 8.0;HDR=YES’ “
示例
static private string startFilePath = @"C:\Users\Weng\Desktop\book.xls";
private string connStr = "provider=microsoft.jet.oledb.4.0;data source=" + startFilePath + "; extended properties='Excel 8.0;HDR=yes; IMEX=2'";
?
在連接字符串中,用 Data Source 參數(shù)指定工作簿的完整路徑和文件名。Extended Properties 參數(shù)可包含兩種屬性:一個(gè)屬性用于 ISAM 版本,一個(gè)屬性用于指示表是否包括標(biāo)題。
?
使用 Excel 工作簿時(shí),默認(rèn)情況下,區(qū)域中的第一行是標(biāo)題行(或字段名稱)。如果第一個(gè)區(qū)域不包含標(biāo)題,可以在連接字符串的擴(kuò)展屬性中指定 HDR=NO。如果您在連接字符串中指定 HDR=NO,Jet OLE DB 提供程序?qū)⒆詣?dòng)為您命名字段(F1 表示第一個(gè)字段,F2 表示第二個(gè)字段,依此類推)。
?
?
2、如何將 Excel 工作簿用作 ADO.NET 數(shù)據(jù)源
2.1檢索記錄
您可以使用 ADO.NET 中的兩種方法之一檢索數(shù)據(jù)庫(kù)中的記錄:
(a)??? Dataset
為從數(shù)據(jù)源檢索到的記錄的緩存。Dataset 中的數(shù)據(jù)通常要比數(shù)據(jù)庫(kù)中的數(shù)據(jù)精簡(jiǎn)得多。但是,您可以像使用實(shí)際數(shù)據(jù)一樣使用它,并且無(wú)須與實(shí)際數(shù)據(jù)庫(kù)連接。除了數(shù)據(jù)檢索之外,還可以使用 Dataset 在基礎(chǔ)數(shù)據(jù)庫(kù)上執(zhí)行更新操作。
??? //微軟的一個(gè)數(shù)據(jù)更新函數(shù)
??????? public static DataSet UpdateRows(string connectionString,string queryString, string tableName)
??????? {
??????????? DataSet dataSet = new DataSet();
??????????? using (OleDbConnection connection = new OleDbConnection(connectionString))
??????????? {
??????????????? OleDbDataAdapter adapter = new OleDbDataAdapter();
??????????????? adapter.SelectCommand = new OleDbCommand(queryString, connection);
??????????????? OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
?? ?????????????connection.Open();
??????????????? adapter.Fill(dataSet, tableName);
??????????????? //code to modify data in DataSet here
??????????????? //Without the OleDbCommandBuilder this line would fail
??????????????? adapter.Update(dataSet, tableName);
??????????????? connection.Close();
??????????? }
??????????? return dataSet;??????
??????? }
(b)?? DataReader
從數(shù)據(jù)庫(kù)中檢索只讀、只進(jìn)數(shù)據(jù)流。當(dāng)您使用 DataReader 程序時(shí),由于內(nèi)存中每次僅有一行,因此性能將增強(qiáng),系統(tǒng)開(kāi)銷將降低。如果您有大量數(shù)據(jù)需要檢索并且不希望更改基礎(chǔ)數(shù)據(jù)庫(kù),則 DataReader 是比 Dataset 更好的選擇。
?
?
2.2 添加和更新記錄使用 ADO.NET,您可以通過(guò)三種方式之一在工作簿中插入和更新記錄:
(1)直接運(yùn)行一個(gè)命令,每次插入或更新一個(gè)記錄。為此,您可以在自己的連接上創(chuàng)建一個(gè) OLEDbCommand 對(duì)象,并將其 CommandText 屬性設(shè)置成一個(gè)插入記錄的有效命令
INSERT INTO [Sheet1$] (F1, F2) values ('111', 'ABC')
或一個(gè)可更新記錄的命令,
UPDATE [Sheet1$] SET F2 = 'XYZ' WHERE F1 = '111'
然后調(diào)用 ExecuteNonQuery 方法。
(2)對(duì)使用 Excel 工作簿中的一個(gè)表/查詢填充的一個(gè) DataSet 做一些更改,然后調(diào)用 DataAdapter 的 Update 方法,以將這些更改從 DataSet 解析回工作簿。不過(guò),要使用 Update 方法執(zhí)行更新解析,您必須為 DataAdapter 的 InsertCommand(?)設(shè)置參數(shù)化命令:
INSERT INTO [Sheet1$] (F1, F2) values (?, ?)
并為 UpdateCommand 設(shè)置參數(shù)化命令:
UPDATE [Sheet1$] SET F2 = ? WHERE F1 = ?
必須要用 INSERT 和 UPDATE 的參數(shù)化命令,因?yàn)?OleDbDataAdapter 不提供 Excel 工作簿的主鍵/索引信息;沒(méi)有主鍵/索引字段,CommandBuilder 就無(wú)法自動(dòng)為您生成命令。
(3)將其它數(shù)據(jù)源(本文件、Microsoft Access 數(shù)據(jù)庫(kù),當(dāng)然也包括其他 Excel 工作簿)中的數(shù)據(jù)導(dǎo)出到 Excel 工作簿中,可通過(guò) Jet OLE DB 提供的程序。使用單個(gè)INSERT INTO 命令,可以將其他表/查詢中的數(shù)據(jù)導(dǎo)出到您的工作簿中:
INSERT INTO [Sheet1$] IN 'C:/Book1.xls' 'Excel 8.0;' SELECT * FROM MyTable"
INSERT INTO 要求目標(biāo)表(或工作表)已存在,并且數(shù)據(jù)已附加到目標(biāo)表中。
?
您還可以使用 SELECT..INTO 將您的表/查詢導(dǎo)出到工作簿中:
SELECT * INTO [Excel 8.0;Database=C:/Book1.xls].[Sheet1] FROM [MyTable]
當(dāng)您使用 SELECT..INTO 時(shí),如果目標(biāo)表或工作簿不存在,將為您創(chuàng)建。如果在發(fā)出 SELECT..INTO 命令之前表已存在,您將收到錯(cuò)誤信息。
稍后的示例代碼 部分對(duì)這些在工作簿中添加和更新記錄的方法中的每一種都進(jìn)行了說(shuō)明。
?
2.3刪除記錄
雖然 Jet OLE DB 提供程序允許您在 Excel 工作簿中插入和更新記錄,但是不允許進(jìn)行 DELETE(刪除)操作。如果您嘗試對(duì)一個(gè)或多個(gè)記錄執(zhí)行 DELETE 操作,您將收到以下錯(cuò)誤信息:
Deleting data in a linked table is not supported by this ISAM.
這是將 Excel 工作簿作為數(shù)據(jù)庫(kù)進(jìn)行處理時(shí)所固有的限制。
?
2.4創(chuàng)建工作簿和表
要在 Excel 工作簿中創(chuàng)建表,請(qǐng)運(yùn)行 CREATE TABLE 命令:
CREATE TABLE Sheet1 (F1 char(255), F2 char(255))
當(dāng)您運(yùn)行此命令時(shí),將使用您在命令中指定的表名稱創(chuàng)建新的工作表。如果不存在要連接的工作簿,也會(huì)創(chuàng)建該工作簿。
2.5示例代碼(VB形式)
| 1. | 啟動(dòng)一個(gè)新的 Visual Basic .NET Windows 應(yīng)用程序項(xiàng)目。默認(rèn)情況下會(huì)創(chuàng)建 Form1。 |
| 2. | 向 Form1 添加六個(gè) RadioButton(單選按鈕)控件和一個(gè) Button(按鈕)控件。 |
| 3. | 選中所有單選按鈕控件,并將大小屬性設(shè)置為 200,24。 |
| 4. | 在視圖菜單上,單擊代碼。 |
| 5. | 在代碼模塊的開(kāi)始處添加以下行: Imports ? System.Data.OleDb |
| ? | ? |
| ? | 6. 將以下代碼插入到Form 類中: Private ? m_sConn1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ ??"Data ? Source=C:/ExcelData1.xls;" & _ ??"Extended ? Properties=""Excel 8.0;HDR=YES""" ??Private ? m_sConn2 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ ??"Data ? Source=C:/ExcelData2.xls;" & _ ??"Extended ? Properties=""Excel 8.0;HDR=YES""" ??Private ? m_sNorthwind = _ ??"C:/Program ? Files/Microsoft Office/Office10/Samples/Northwind.mdb" ??Private ? m_sAction As String ??Private ? Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) ? Handles MyBase.Load ??RadioButton1.Text ? = "Create_Workbook" ??RadioButton2.Text ? = "Retrieve_Records" ??RadioButton3.Text ? = "Add_Records" ??RadioButton4.Text ? = "Update_Records" ??RadioButton5.Text ? = "Update_Individual_Cells" ??RadioButton6.Text ? = "Use_External_Source" ??Button1.Text ? = "Go!" ??End ? Sub ??Private ? Sub RadioButtons_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ ??Handles ? RadioButton1.Click, RadioButton2.Click, RadioButton3.Click, _ ??RadioButton4.Click, ? RadioButton5.Click, RadioButton6.Click ??m_sAction ? = sender.Text'Store the text for the selected radio button ??End ? Sub ??Private ? Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ? Handles Button1.Click ??Try ??' ? Call the associated routine to add/update/modify the workbook. ??Select ? Case m_sAction ??Case ? "Create_Workbook" : Create_Workbook() ??Case ? "Retrieve_Records" : Retrieve_Records() ??Case ? "Add_Records" : Add_Records() ??Case ? "Update_Records" : Update_Records() ??Case ? "Update_Individual_Cells" : Update_Individual_Cells() ??Case ? "Use_External_Source" : Use_External_Source() ??End ? Select ??Catch ? ex As OleDbException ??Dim ? er As OleDbError ??For ? Each er In ex.Errors ??MsgBox(er.Message) ??Next ??Catch ? ex2 As System.InvalidOperationException ??MsgBox(ex2.Message) ??End ? Try ??End ? Sub ??Public ? Sub Create_Workbook() ??' If ? the workbooks already exist, prompt to delete. ??Dim ? answer As MsgBoxResult ??If ? Dir("C:/ExcelData1.xls") <> "" Or ? Dir("C:/ExcelData2.xls") <> "" Then ??answer ? = MsgBox("Delete existing workbooks (C:/ExcelData1.xls and " & ? _ ??"C:/ExcelData2.xls)?", ? MsgBoxStyle.YesNo) ??If ? answer = MsgBoxResult.Yes Then ??If ? Dir("C:/ExcelData1.xls") <> "" Then ? Kill("C:/ExcelData1.xls") ??If ? Dir("C:/ExcelData2.xls") <> "" Then ? Kill("C:/ExcelData2.xls") ??Else ??Exit ? Sub ??End ? If ??End ? If ??'========================================================================== ??' ? Create a workbook with a table named EmployeeData. The table has 3 ??' ? fields: ID (char 255), Name (char 255) and Birthdate (date). ??'========================================================================== ??Dim ? conn As New OleDbConnection() ??conn.ConnectionString ? = m_sConn1 ??conn.Open() ??Dim ? cmd1 As New OleDbCommand() ??cmd1.Connection ? = conn ??cmd1.CommandText ? = "CREATE TABLE EmployeeData (Id char(255), Name char(255), BirthDate ? date)" ??cmd1.ExecuteNonQuery() ??cmd1.CommandText ? = "INSERT INTO EmployeeData (Id, Name, BirthDate) values ('AAA', ? 'Andrew', '12/4/1955')" ??cmd1.ExecuteNonQuery() ??conn.Close() ??'========================================================================== ??' ? Create a workbook with a table named InventoryData. The table has 3 ??' ? fields: Product (char 255), Qty (float) and Price (currency). ??'========================================================================== ??conn.ConnectionString ? = m_sConn2 ??conn.Open() ??Dim ? cmd2 As New OleDbCommand() ??cmd2.Connection ? = conn ??cmd2.CommandText ? = "CREATE TABLE InventoryData (Product char(255), Qty float, Price ? currency)" ??cmd2.ExecuteNonQuery() ??cmd2.CommandText ? = "INSERT INTO InventoryData (Product, Qty, Price) values ('Cola', 200, ? 1.35)" ??cmd2.ExecuteNonQuery() ??cmd2.CommandText ? = "INSERT INTO InventoryData (Product, Qty, Price) values ('Chips', 550, ? 0.89)" ??cmd2.ExecuteNonQuery() ??conn.Close() ??' ? NOTE: You can ALTER and DROP tables in a similar fashion. ??End ? Sub ??Public ? Sub Retrieve_Records() ??'========================================================== ??'Use ? a DataReader to read data from the EmployeeData table. ??'========================================================== ??Dim ? conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1) ??conn1.Open() ??Dim ? cmd1 As New System.Data.OleDb.OleDbCommand("Select ? * From [EmployeeData$]", conn1) ??Dim ? rdr As OleDbDataReader = cmd1.ExecuteReader ??Debug.WriteLine(vbCrLf ? & "EmployeeData:" & vbCrLf & "=============") ??Do ? While rdr.Read() ??Debug.WriteLine(System.String.Format("{0,-10}{1, ? -15}{2}", _ ??rdr.GetString(0), ? rdr.GetString(1), _ ??rdr.GetDateTime(2).ToString("d"))) ??Loop ??rdr.Close() ??conn1.Close() ??'======================================================== ??'Use ? a DataSet to read data from the InventoryData table. ??'======================================================== ??Dim ? conn2 As New OleDbConnection(m_sConn2) ??Dim ? da As New OleDbDataAdapter("Select ? * From [InventoryData$]", conn2) ??Dim ? ds As DataSet = New DataSet() ??da.Fill(ds) ??Debug.WriteLine(vbCrLf ? & "InventoryData:" & vbCrLf & ? "==============") ??Dim ? dr As DataRow ??For ? Each dr In ds.Tables(0).Rows'Show results in output window ??Debug.WriteLine(System.String.Format("{0,-15}{1, ? -6}{2}", _ ??dr("Product"), ? dr("Qty"), dr("Price"))) ??Next ??conn2.Close() ??End ? Sub ??Public ? Sub Add_Records() ??'========================================================================== ??' Run ? an INSERT INTO command to add new records to the workbook. ??'========================================================================== ??Dim ? conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1) ??conn1.Open() ??Dim ? cmd As New System.Data.OleDb.OleDbCommand() ??cmd.Connection = conn1 ??cmd.CommandText = "INSERT INTO ? [EmployeeData$] (ID, Name, BirthDate) values ('CCC', 'Charlie', ? '10/14/48')" ??cmd.ExecuteNonQuery() ??cmd.CommandText = "INSERT INTO ? [EmployeeData$] (ID, Name, BirthDate) values ('DDD', 'Deloris', ? '7/19/98')" ??cmd.ExecuteNonQuery() ??conn1.Close() ??'==================================================================== ??'Use ? the InsertCommand object to add new records to the InventoryData ??'table. ??'==================================================================== ??Dim ? conn2 As New OleDbConnection(m_sConn2) ??Dim ? da As New OleDbDataAdapter("Select * From [InventoryData$]", conn2) ??Dim ? ds As DataSet = New DataSet() ??da.Fill(ds, ? "MyExcelTable") ??' ? Generate the InsertCommand and add the parameters for the command. ??da.InsertCommand ? = New OleDbCommand( _ ??"INSERT INTO [InventoryData$] (Product, ? Qty, Price) VALUES (?, ?, ?)", conn2) ??da.InsertCommand.Parameters.Add("@Product", ? OleDbType.VarChar, 255, "Product") ??da.InsertCommand.Parameters.Add("@Qty", ? OleDbType.Double).SourceColumn = "Qty" ??da.InsertCommand.Parameters.Add("@Price", ? OleDbType.Currency).SourceColumn = "Price" ??' Add two new records to the dataset. ??Dim ? dr As DataRow ??dr = ? ds.Tables(0).NewRow ??dr("Product") ? = "Bread" : dr("Qty") = 390 : dr("Price") = ? 1.89 : ds.Tables(0).Rows.Add(dr) ??dr = ? ds.Tables(0).NewRow ??dr("Product") ? = "Milk" : dr("Qty") = 99 : dr("Price") = 2.59 ? : ds.Tables(0).Rows.Add(dr) ??' ? Apply the dataset changes to the actual data source (the workbook). ??da.Update(ds, ? "MyExcelTable") ??conn2.Close() ??End ? Sub ??Public ? Sub Update_Records() ??'========================================================================== ??' Run ? an UPDATE command to change a record in the EmployeeData ??' ? table. ??'========================================================================== ??Dim ? conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1) ??conn1.Open() ??Dim ? cmd As New System.Data.OleDb.OleDbCommand() ??cmd.Connection ? = conn1 ??cmd.CommandText ? = "UPDATE [EmployeeData$] " & _ ??"SET ? NAME = 'Aaron', BirthDate = '5/4/1975' WHERE ID = 'AAA'" ??cmd.ExecuteNonQuery() ??conn1.Close() ??'==================================================================== ??' Use ? the UpdateCommand object to modify records in the InventoryData ??' ? table. ??'==================================================================== ??Dim ? conn2 As New OleDbConnection(m_sConn2) ??Dim ? da As New OleDbDataAdapter("Select * From [InventoryData$]", conn2) ??Dim ? ds As DataSet = New DataSet() ??da.Fill(ds, ? "MyInventoryTable") ??' ? Generate the UpdateCommand and add the parameters for the command. ??da.UpdateCommand ? = New OleDbCommand( _ ??"UPDATE ? [InventoryData$] SET Qty = ?, Price=? WHERE Product = ?", conn2) ??da.UpdateCommand.Parameters.Add("@Qty", ? OleDbType.Numeric).SourceColumn = "Qty" ??da.UpdateCommand.Parameters.Add("@Price", ? OleDbType.Currency).SourceColumn = "Price" ??da.UpdateCommand.Parameters.Add("@Product", ? OleDbType.VarChar, 255, "Product") ??' ? Update the first two records. ??ds.Tables(0).Rows(0)("Qty") ? = 1000 ??ds.Tables(0).Rows(0)("Price") ? = 10.1 ??ds.Tables(0).Rows(1)("Qty") ? = 2000 ??ds.Tables(0).Rows(1)("Price") ? = 20.2 ??' ? Apply the dataset changes to the actual data source (the workbook). ??da.Update(ds, ? "MyInventoryTable") ??conn2.Close() ??End ? Sub ??Public ? Sub Update_Individual_Cells() ??'========================================================================== ??' ? Update individual cells on the EmployeeData worksheet; ??' ? specifically, cells F3, G3, and I4 are modified. ??'========================================================================== ??' ? NOTE: The connection string indicates that the table does *NOT* ??' ? have a header row. ??Dim ? conn As New ? System.Data.OleDb.OleDbConnection(m_sConn1.Replace("HDR=YES", ? "HDR=NO")) ??conn.Open() ??Dim ? cmd As New System.Data.OleDb.OleDbCommand() ??cmd.Connection ? = conn ??cmd.CommandText ? = "UPDATE [EmployeeData$F3:G3] SET F1 = 'Cell F3', F2 = 'Cell G3'" ??cmd.ExecuteNonQuery() ??cmd.CommandText ? = "UPDATE [EmployeeData$I4:I4] SET F1 = 'Cell I4'" ??cmd.ExecuteNonQuery() ??conn.Close() ??End ? Sub ??Public ? Sub Use_External_Source() ??' ? Open a connection to the sample Northwind Access database. ??Dim ? conn As New System.Data.OleDb.OleDbConnection( _ ??"Provider=Microsoft.Jet.OLEDB.4.0;Data ? Source=" & m_sNorthwind & ";") ??conn.Open() ??Dim ? cmd As New System.Data.OleDb.OleDbCommand() ??cmd.Connection ? = conn ??'======================================================================= ??' Run ? an INSERT..INTO command on the Northwind database to append ??' the ? records from a table/query to an existing table in the Excel ??' ? workbook. ??'======================================================================= ??cmd.CommandText ? = "INSERT INTO [EmployeeData$] IN 'C:/ExcelData1.xls' 'Excel 8.0;'" ? & _ ??"SELECT ? EmployeeID AS ID, FirstName AS Name, BirthDate FROM Employees" ??cmd.ExecuteNonQuery() ??'========================================================================== ??' Run ? a SELECT..INTO command on the Northwind database to insert ??' all ? the records from a table/query into a new sheet in the Excel ??' ? workbook. ??'========================================================================== ??cmd.CommandText ? = "SELECT * INTO [Excel ? 8.0;Database=C:/ExcelData2.xls].[ProductSales]" & _ ??"FROM ? [Product Sales for 1997]" ??cmd.ExecuteNonQuery() ??conn.Close() ??End ? Sub |
| 7. | 如果需要,可為代碼中的 m_sNorthwind 成員修改指向 Access 示例數(shù)據(jù)庫(kù) Northwind 的路徑。 |
試運(yùn)行
| 1. | 在視圖菜單上,指向其他窗口,然后單擊輸出以顯示輸出窗口。 |
| 2. | 按 F5 鍵生成并運(yùn)行程序。 |
| 3. | 單擊 Create_Workbook,然后單擊 Go(執(zhí)行。下同)。Create_Workbook 過(guò)程將運(yùn)行 CREATE TABLE 命令以創(chuàng)建兩個(gè)新的工作簿:C:/ExcelData1.xls 和 C:/ExcelData2.xls。ExcelData1.xls 包含一個(gè)名為 EmployeeData 的工作表(表),ExcelData2.xls 包含一個(gè)名為 InventoryData 的工作表(表)。這兩個(gè)表都填入了記錄。 ? 注意:請(qǐng)?jiān)诖藴y(cè)試的每個(gè)其余步驟中,在 Excel 中打開(kāi)工作簿以檢查結(jié)果。或者,單擊 Retrieve_Records 以在 Visual Studio ? .NET 的輸出窗口中查看表內(nèi)容。 |
| 4. | 單擊 Retrieve_Records,然后單擊 Go。Retrieve_Records 過(guò)程將從表中提取記錄并將它們顯示在輸出窗口中,輸出的記錄類似于下面的內(nèi)容: EmployeeData: ??============= ??AAA Andrew ? ?12/4/1955 ??InventoryData: ??============== ??Cola ?200 1.35 ??Chips ? ?550 0.89 |
| 5. | 單擊 Add_Records,然后單擊 Go。Add_Records 例程將向每個(gè)表添加兩條記錄: 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 例程在每一個(gè)工作簿中更新兩條記錄: 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。當(dāng)您使用 INSERT..INTO 命令時(shí),Use_External_Source 例程將 Northwind 表“Employees”中的記錄追加到 ExcelData1.xls 中的 EmployeeData 工作表中。并且,Use_External_Source 使用 SELECT..INTO 命令在 ExcelData2.xls 中創(chuàng)建一個(gè)包含 Northwind 表“Products”中的所有記錄的新表(或工作表)。 ? 注意:如果您單擊 Use_External_Source 多次,Employees 列表將被追加多次,原因是主鍵未被識(shí)別或?qū)嵤?/span> |
?
?
?
參考資料
[1] C#數(shù)據(jù)庫(kù)操作——新建表、查詢、刪除、添加、更新等
http://blog.sina.com.cn/s/blog_4b1260cb0100kjfj.html
【2】http://blog.csdn.net/zhrtzc/article/details/5219855#
總結(jié)
以上是生活随笔為你收集整理的OLEDB Excel 与C# 的数据流通方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 年度榜单:2013年最流行的15款免费英
- 下一篇: 带标题和导航点的ViewPager