国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
使用C# 向 Excel 工作薄傳輸數(shù)據(jù)
本文分步介紹了多種從 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 傳輸數(shù)據(jù)的方法。本文還提供了每種方法的優(yōu)點(diǎn)和缺點(diǎn),以便您可以選擇最適合您的情況的解決方案。

概述

最常用于向 Excel 工作簿傳輸數(shù)據(jù)的方法是“自動(dòng)化”。利用“自動(dòng)化”功能,您可以調(diào)用特定于 Excel 任務(wù)的方法和屬性。“自動(dòng)化”功能為您提供了指定數(shù)據(jù)在工作簿中所處的位置、將工作簿格式化以及在運(yùn)行時(shí)進(jìn)行各種設(shè)置的最大的靈活性。

利用“自動(dòng)化”功能,您可以使用多種方法來傳輸數(shù)據(jù):
  • 逐個(gè)單元格地傳輸數(shù)據(jù)。
  • 將數(shù)組中的數(shù)據(jù)傳輸?shù)絾卧駞^(qū)域。
  • 使用“CopyFromRecordset”方法向單元格區(qū)域傳輸 ADO 記錄集中的數(shù)據(jù)。
  • 在 Excel 工作表上創(chuàng)建一個(gè)“QueryTable”對(duì)象,該對(duì)象包含對(duì) ODBC 或 OLEDB 數(shù)據(jù)源進(jìn)行查詢的結(jié)果。
  • 將數(shù)據(jù)傳輸?shù)郊糍N板,然后將剪貼板內(nèi)容粘貼到 Excel 工作表中。
還可以使用多種未必需要利用“自動(dòng)化”功能來向 Excel 傳輸數(shù)據(jù)的方法。如果您正在運(yùn)行服務(wù)器端程序,這會(huì)是一種將批量數(shù)據(jù)處理從客戶端移走的好方法。

要在不使用“自動(dòng)化”功能的情況下傳輸數(shù)據(jù),您可以使用下列方法:
  • 將數(shù)據(jù)傳輸?shù)街票矸指舻幕蚨禾?hào)分隔的文本文件,然后 Excel 可以將該文本文件分析為工作表上的單元格。
  • 使用 ADO.NET 將數(shù)據(jù)傳輸?shù)焦ぷ鞅怼?
  • 將 XML 數(shù)據(jù)傳輸?shù)?Excel(僅限于 2002 和 2003 版)以提供可以被格式化和排列為行和列的數(shù)據(jù)。
本文討論了其中的每一種方法并提供了每一種方法的代碼示例。本文的創(chuàng)建完整的示例 Visual C# 2005 或 Visual C# .NET 項(xiàng)目一節(jié)(在本文稍后部分)演示了如何創(chuàng)建執(zhí)行每一種方法的 Visual C# .NET 程序。

方法

使用“自動(dòng)化”功能逐單元格傳輸數(shù)據(jù)

利用“自動(dòng)化”功能,您可以逐單元格地向工作表傳輸數(shù)據(jù):
// Start a new workbook in Excel.m_objExcel = new Excel.Application();m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));// Add data to cells in the first worksheet in the new workbook.m_objSheets = (Excel.Sheets)m_objBook.Worksheets;m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));m_objRange = m_objSheet.get_Range("A1", m_objOpt);m_objRange.Value = "Last Name";m_objRange = m_objSheet.get_Range("B1", m_objOpt);m_objRange.Value = "First Name";m_objRange = m_objSheet.get_Range("A2", m_objOpt);m_objRange.Value = "Doe";m_objRange = m_objSheet.get_Range("B2", m_objOpt);m_objRange.Value = "John";// Apply bold to cells A1:B1.m_objRange = m_objSheet.get_Range("A1", "B1");m_objFont = m_objRange.Font;m_objFont.Bold=true;// Save the Workbook and quit Excel.m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,m_objOpt, m_objOpt, m_objOpt, m_objOpt);m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit();
如果您具有少量的數(shù)據(jù),則逐單元格地傳輸數(shù)據(jù)是可以接受的方法。您可以靈活地將數(shù)據(jù)放到工作簿中的任何地方,并可以在運(yùn)行時(shí)根據(jù)條件對(duì)單元格進(jìn)行格式設(shè)置。不過,如果您具有大量需要傳輸?shù)?Excel 工作簿的數(shù)據(jù),則使用這種方法不是一個(gè)好主意。您在運(yùn)行時(shí)獲取的每一個(gè)“Range”對(duì)象都會(huì)產(chǎn)生一個(gè)接口請(qǐng)求,這意味著數(shù)據(jù)傳輸速度會(huì)變得較慢。此外,Microsoft Windows 95、Microsoft Windows 98 以及 Microsoft Windows Millennium Edition (Me) 都對(duì)接口請(qǐng)求有 64 KB 的限制。如果您具有 64 KB 以上的接口請(qǐng)求,則“自動(dòng)化”服務(wù)器 (Excel) 可能會(huì)停止響應(yīng),或者您可能會(huì)收到指出內(nèi)存不足的錯(cuò)誤消息。 有關(guān)其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章:
216400  (http://support.microsoft.com/kb/216400/ ) PRB:Win95/98 上的進(jìn)程間 COM 自動(dòng)化可使客戶端應(yīng)用程序掛起
需要再次強(qiáng)調(diào)的是,逐單元格地傳輸數(shù)據(jù)僅對(duì)少量數(shù)據(jù)而言才可以接受。如果您必須向 Excel 傳輸大型數(shù)據(jù)集,則應(yīng)考慮使用本文中討論的其他方法之一來批量地傳輸數(shù)據(jù)。

有關(guān)其他信息以及如何利用 Visual C# .NET 自動(dòng)運(yùn)行 Excel 的示例,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章:
302084  (http://support.microsoft.com/kb/302084/ ) 如何在 Microsoft Visual C# .NET 中使 Microsoft Excel 自動(dòng)運(yùn)行

使用“自動(dòng)化”功能將數(shù)據(jù)數(shù)組傳輸?shù)焦ぷ鞅砩系膮^(qū)域

可以將數(shù)據(jù)數(shù)組一次性地傳輸?shù)接啥鄠€(gè)單元格組成的區(qū)域:
// Start a new workbook in Excel.m_objExcel = new Excel.Application();m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));m_objSheets = (Excel.Sheets)m_objBook.Worksheets;m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));// Create an array for the headers and add it to cells A1:C1.object[] objHeaders = {"Order ID", "Amount", "Tax"};m_objRange = m_objSheet.get_Range("A1", "C1");m_objRange.Value = objHeaders;m_objFont = m_objRange.Font;m_objFont.Bold=true;// Create an array with 3 columns and 100 rows and add it to// the worksheet starting at cell A2.object[,] objData = new Object[100,3];Random rdm = new Random((int)DateTime.Now.Ticks);double nOrderAmt, nTax;for(int r=0;r<100;r++){objData[r,0] = "ORD" + r.ToString("0000");nOrderAmt = rdm.Next(1000);objData[r,1] = nOrderAmt.ToString("c");nTax = nOrderAmt*0.07;objData[r,2] = nTax.ToString("c");}m_objRange = m_objSheet.get_Range("A2", m_objOpt);m_objRange = m_objRange.get_Resize(100,3);m_objRange.Value = objData;// Save the Workbook and quit Excel.m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,m_objOpt, m_objOpt, m_objOpt, m_objOpt);m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit();
如果您使用數(shù)組而不是逐單元格地傳輸數(shù)據(jù),則在傳輸大量數(shù)據(jù)時(shí),傳輸性能會(huì)大大地增強(qiáng)。請(qǐng)考慮前面代碼中的下面幾行,這些行將數(shù)據(jù)傳輸?shù)焦ぷ鞅碇械?300 個(gè)單元格:
objRange = objSheet.get_Range("A2", m_objOpt);objRange = objRange.get_Resize(100,3);objRange.Value = objData;
上面的代碼代表了兩個(gè)接口請(qǐng)求:一個(gè)請(qǐng)求是針對(duì)“Range”方法返回的“Range”對(duì)象,另一個(gè)請(qǐng)求是針對(duì)“Resize”方法返回的“Range”對(duì)象。相比之下,逐單元格地傳輸數(shù)據(jù)卻需要對(duì)“Range”對(duì)象發(fā)出 300 個(gè)接口請(qǐng)求。只要有可能,您就可以從批量地傳輸數(shù)據(jù)以及減少所發(fā)出的接口請(qǐng)求的數(shù)量當(dāng)中受益。

有關(guān)通過 Excel 自動(dòng)化并使用數(shù)組獲取和設(shè)置區(qū)域中的值的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章:
302096  (http://support.microsoft.com/kb/302096/ ) 如何在 Visual C# 中使 Excel 自動(dòng)運(yùn)行以使用數(shù)組填充或獲取某個(gè)區(qū)域中的數(shù)據(jù)

使用“自動(dòng)化”功能將 ADO 記錄集傳輸?shù)焦ぷ鞅韰^(qū)域

Excel 2000、Excel 2002 和 Excel 2003 的對(duì)象模型提供了“CopyFromRecordset”方法,用于向工作表上的區(qū)域傳輸 ADO 記錄集。下面的代碼說明了如何使用“CopyFromRecordset”方法使 Excel 自動(dòng)運(yùn)行,以傳輸 Northwind 示例數(shù)據(jù)庫中的“訂單”表的內(nèi)容:
// Create a Recordset from all the records in the Orders table.ADODB.Connection objConn = new ADODB.Connection();ADODB._Recordset objRS = null;objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +m_strNorthwind + ";", "", "", 0);objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;object objRecAff;objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff,(int)ADODB.CommandTypeEnum.adCmdTable);// Start a new workbook in Excel.m_objExcel = new Excel.Application();m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));m_objSheets = (Excel.Sheets)m_objBook.Worksheets;m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));// Get the Fields collection from the recordset and determine// the number of fields (or columns).System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();int nFields = objRS.Fields.Count;// Create an array for the headers and add it to the// worksheet starting at cell A1.object[] objHeaders = new object[nFields];ADODB.Field objField = null;for(int n=0;n<nFields;n++){objFields.MoveNext();objField = (ADODB.Field)objFields.Current;objHeaders[n] = objField.Name;}m_objRange = m_objSheet.get_Range("A1", m_objOpt);m_objRange = m_objRange.get_Resize(1, nFields);m_objRange.Value = objHeaders;m_objFont = m_objRange.Font;m_objFont.Bold=true;// Transfer the recordset to the worksheet starting at cell A2.m_objRange = m_objSheet.get_Range("A2", m_objOpt);m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);// Save the Workbook and quit Excel.m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,m_objOpt, m_objOpt, m_objOpt, m_objOpt);m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit();// Close the recordset and connection.objRS.Close();objConn.Close();
注意:“CopyFromRecordset”只能與 ADO“Recordset”對(duì)象一起使用。使用 ADO.NET 創(chuàng)建的“DataSet”不能與“CopyFromRecordset”方法一起使用。以下幾節(jié)中的多個(gè)示例演示了如何利用 ADO.NET 向 Excel 傳輸數(shù)據(jù)。

使用“自動(dòng)化”功能在工作表上創(chuàng)建 QueryTable 對(duì)象

“QueryTable”對(duì)象代表了一個(gè)表,該表是用從外部數(shù)據(jù)源返回的數(shù)據(jù)生成的。當(dāng)您自動(dòng)運(yùn)行 Excel 時(shí),可以通過提供指向 OLE DB 或 ODBC 數(shù)據(jù)源的連接字符串和 SQL 字符串來創(chuàng)建“QueryTable”。Excel 將生成記錄集并將該記錄集插入到工作表中您所指定的位置。“QueryTable”對(duì)象提供了下列優(yōu)于“CopyFromRecordset”方法的優(yōu)點(diǎn):
  • Excel 處理記錄集的創(chuàng)建并將其放置到工作表中。
  • 您可以利用“QueryTable”對(duì)象保存查詢,并在以后刷新它以獲取更新的記錄集。
  • 當(dāng)向工作表中添加新的“QueryTable”時(shí),可以指定將工作表上的單元格中已經(jīng)存在的數(shù)據(jù)移位,以處理新數(shù)據(jù)(有關(guān)更多信息,請(qǐng)查看“RefreshStyle”屬性)。
下面的代碼演示了如何自動(dòng)運(yùn)行 Excel 2000、Excel 2002 或 Excel 2003,以便使用 Northwind 示例數(shù)據(jù)庫中的數(shù)據(jù)在 Excel 工作表中創(chuàng)建新的“QueryTable”:
// Start a new workbook in Excel.m_objExcel = new Excel.Application();m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));// Create a QueryTable that starts at cell A1.m_objSheets = (Excel.Sheets)m_objBook.Worksheets;m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));m_objRange = m_objSheet.get_Range("A1", m_objOpt);m_objQryTables = m_objSheet.QueryTables;m_objQryTable = (Excel._QueryTable)m_objQryTables.Add("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +m_strNorthwind + ";", m_objRange, "Select * From Orders");m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;m_objQryTable.Refresh(false);// Save the workbook and quit Excel.m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,m_objOpt, m_objOpt);m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit();

使用 Windows 剪貼板

可以使用 Windows 剪貼板來向工作表傳輸數(shù)據(jù)。要將數(shù)據(jù)粘貼到工作表上的多個(gè)單元格中,可以復(fù)制具有以下格式的字符串:在該字符串中,列由制表符分隔,行由回車符分隔。下面的代碼說明了 Visual C# .NET 如何使用 Windows 剪貼板來向 Excel 傳輸數(shù)據(jù):
// Copy a string to the Windows clipboard.string sData = "FirstName\tLastName\tBirthdate\r\n"  +"Bill\tBrown\t2/5/85\r\n"  +"Joe\tThomas\t1/1/91";System.Windows.Forms.Clipboard.SetDataObject(sData);// Start a new workbook in Excel.m_objExcel = new Excel.Application();m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));// Paste the data starting at cell A1.m_objSheets = (Excel.Sheets)m_objBook.Worksheets;m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));m_objRange = m_objSheet.get_Range("A1", m_objOpt);m_objSheet.Paste(m_objRange, false);// Save the workbook and quit Excel.m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,m_objOpt, m_objOpt);m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit();

創(chuàng)建可由 Excel 分析為行和列的帶分隔符的文本文件

Excel 可以打開由制表符或逗號(hào)分隔的文件并正確地將數(shù)據(jù)分析為單元格。當(dāng)您希望向工作表傳輸大量數(shù)據(jù)而只使用少量(如果有的話)自動(dòng)化功能時(shí),可以使用此功能。這對(duì)于客戶端-服務(wù)器程序而言可能是一個(gè)好方法,因?yàn)槲谋疚募梢栽诜?wù)器端生成。然后,可以在客戶端根據(jù)需要使用“自動(dòng)化”功能來打開文本文件。

下面的代碼說明了如何從利用 ADO.NET 讀取的數(shù)據(jù)生成制表符分隔的文本文件:
// Connect to the data source.System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");objConn.Open();// Execute a command to retrieve all records from the Employees table.System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand("Select * From Employees", objConn);System.Data.OleDb.OleDbDataReader objReader;objReader = objCmd.ExecuteReader();// Create the FileStream and StreamWriter object to write// the recordset contents to file.System.IO.FileStream fs = new System.IO.FileStream(m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Unicode);// Write the field names (headers) as the first line in the text file.sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +"\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +"\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));// Write the first six columns in the recordset to a text file as// tab-delimited.while(objReader.Read()){for(int i=0;i<=5;i++){if(!objReader.IsDBNull(i)){string s;s = objReader.GetDataTypeName(i);if(objReader.GetDataTypeName(i)=="DBTYPE_I4"){sw.Write(objReader.GetInt32(i).ToString());}else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE"){sw.Write(objReader.GetDateTime(i).ToString("d"));}else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR"){sw.Write(objReader.GetString(i));}}if(i<5) sw.Write("\t");}sw.WriteLine();}sw.Flush();	// Write the buffered data to the filestream.// Close the FileStream.fs.Close();// Close the reader and the connection.objReader.Close();objConn.Close();
上述代碼沒有使用“自動(dòng)化”功能。不過,如果您愿意,您可以按如下方式使用“自動(dòng)化”功能來打開文本文件,并以 Excel 工作簿格式保存該文件:
// Open the text file in Excel.m_objExcel = new Excel.Application();m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1,Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,false, true, false, false, false, false, m_objOpt, m_objOpt,m_objOpt, m_objOpt, m_objOpt);m_objBook = m_objExcel.ActiveWorkbook;// Save the text file in the typical workbook format and quit Excel.m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal,m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,m_objOpt, m_objOpt);m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit();

使用 ADO.NET 將數(shù)據(jù)傳輸?shù)焦ぷ鞅?/h4>您可以使用 Microsoft Jet OLE DB 提供程序向現(xiàn)有的 Excel 工作簿中的表中添加記錄。Excel 中的只是由單元格組成的區(qū)域;該區(qū)域可能具有定義的名稱。通常,區(qū)域的第一行包含標(biāo)題(或字段名),該區(qū)域中所有以后的行都包含記錄。

下面的代碼向 Book7.xls 中的表中添加了兩個(gè)新記錄。在此示例中,該表是 Sheet1:
// Establish a connection to the data source.System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +"Book7.xls;Extended Properties=Excel 8.0;");objConn.Open();// Add two records to the table named 'MyTable'.System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();objCmd.Connection = objConn;objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +" values ('Bill', 'Brown')";objCmd.ExecuteNonQuery();objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +" values ('Joe', 'Thomas')";objCmd.ExecuteNonQuery();// Close the connection.objConn.Close();
當(dāng)您按本示例所示的方法利用 ADO.NET 添加記錄時(shí),工作簿中的格式將被保持。添加到行中的每個(gè)記錄都將繼承它前面的行的格式。

有關(guān)使用 ADO.NET 的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章:
306636  (http://support.microsoft.com/kb/306636/ ) 如何使用 ADO.NET 2005 和 Visual C# 2005 或者 ADO.NET 和 Visual C# .NET 連接到數(shù)據(jù)庫并運(yùn)行命令
314145  (http://support.microsoft.com/kb/314145/ ) 如何使用 Visual C# .NET 從數(shù)據(jù)庫填充 DataSet 對(duì)象
307587  (http://support.microsoft.com/kb/307587/ ) 如何使用 Visual C# 2005 或 Visual C# .NET 從 DataSet 對(duì)象更新數(shù)據(jù)庫
有關(guān)如何將 Jet OLEDB 提供程序與 Excel 數(shù)據(jù)源一起使用的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章。
316934  (http://support.microsoft.com/kb/316934/ ) 如何在 Visual Basic .NET 中使用 ADO.NET 檢索和修改 Excel 工作簿中的記錄
278973  (http://support.microsoft.com/kb/278973/ ) ExcelADO 演示如何在 Excel 工作簿中使用 ADO 來讀寫數(shù)據(jù)
257819  (http://support.microsoft.com/kb/257819/ ) 如何在 Visual Basic 或 VBA 中使用 ADO 來處理 Excel 數(shù)據(jù)

傳輸 XML 數(shù)據(jù)(Excel 2002 和 Excel 2003)

Excel 2002 和 2003 可以打開格式完好的任何 XML 文件。您可以使用“文件”菜單上的“打開”命令直接打開 XML 文件,也可以使用“Workbooks”集合的“Open”或“OpenXML”方法以編程方式打開 XML 文件。如果您創(chuàng)建供在 Excel 中使用的 XML 文件,您還可以創(chuàng)建樣式表來設(shè)置數(shù)據(jù)的格式。

有關(guān)如何將 XML 與 Excel 2002 一起使用的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章:
307029  (http://support.microsoft.com/kb/307029/ ) 如何使用 Visual C# 向 Microsoft Excel 2002 傳輸 XML 數(shù)據(jù)
288215  (http://support.microsoft.com/kb/288215/ ) INFO:Microsoft Excel 2002 和 XML

創(chuàng)建完整的示例 Visual C# .NET 項(xiàng)目

  1. 創(chuàng)建一個(gè)名為 C:\ExcelData 的新文件夾。示例程序?qū)⒃诖宋募A中存儲(chǔ) Excel 工作簿。
  2. 創(chuàng)建一個(gè)新工作簿,以供示例向其中寫入數(shù)據(jù):
    1. 在 Excel 中啟動(dòng)一個(gè)新工作簿。
    2. 在新工作簿的 Sheet1 上,在單元格 A1 中鍵入 FirstName,在單元格 B1 中鍵入 LastName
    3. 選擇 A1:B1。
    4. 在“插入”菜單上,指向“名稱”,然后單擊“定義”。鍵入名稱 MyTable,然后單擊“確定”。
    5. 將該工作簿另存為 C:\Exceldata\Book7.xls
    6. 退出 Excel。
  3. 啟動(dòng) Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET。在“文件”菜單上,指向“新建”,然后單擊“項(xiàng)目”。在“Visual C# 項(xiàng)目”或“Visual C#”下,選擇“Windows 應(yīng)用程序”。默認(rèn)情況下會(huì)創(chuàng)建 Form1。
  4. 添加對(duì) Excel 對(duì)象庫和 ADODB 主互操作程序集的引用。為此,請(qǐng)按照下列步驟操作:
    1. 在“項(xiàng)目”菜單上,單擊“添加引用”。
    2. 在“NET”選項(xiàng)卡上,找到“ADODB”,然后單擊“選擇”。

      注意:在 Visual Studio 2005 中,您不需要單擊“選擇”。
    3. 在“COM”選項(xiàng)卡上,找到“Microsoft Excel 10.0 對(duì)象庫或 Microsoft Excel 11.0 對(duì)象庫”,然后單擊“選擇”。

      注意:在 Visual Studio 2005 中,您不需要單擊“選擇”。

      注意:如果您正在使用 Microsoft Excel 2002,并且尚未這樣做,Microsoft 建議您下載并安裝 Microsoft Office XP 主互操作 程序集 (PIA)。 有關(guān) Office XP PIA 的更多信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫中相應(yīng)的文章:
      328912  (http://support.microsoft.com/kb/328912/ ) Microsoft Office XP主互操作程序集 (PIA) 可供下載
    4. 在“添加引用”對(duì)話框中,單擊“確定”以接受您的選擇。
  5. 向 Form1 中添加一個(gè)“Combo Box”控件和一個(gè)“Button”控件。
  6. 為該窗體的“Load”事件和 Button 控件的“Click”事件添加事件處理程序:
    1. 在 Form1.cs 的設(shè)計(jì)視圖中,雙擊“Form1”。

      此時(shí)將創(chuàng)建該窗體的“Load”事件的處理程序,該處理程序出現(xiàn)在 Form1.cs 中。
    2. 在“視圖”菜單上,單擊“設(shè)計(jì)器”以切換到設(shè)計(jì)視圖。
    3. 雙擊“Button1”。

      此時(shí)將創(chuàng)建該按鈕的“Click”事件的處理程序,該處理程序出現(xiàn)在 Form1.cs 中。
  7. 在 Form1.cs 中,將以下代碼:
    private void Form1_Load(object sender, System.EventArgs e)    {    }    private void button1_Click(object sender, System.EventArgs e)    {    }    
    替換為:
            // Excel object references.    private Excel.Application m_objExcel =  null;    private Excel.Workbooks m_objBooks = null;    private Excel._Workbook m_objBook = null;    private Excel.Sheets m_objSheets = null;    private Excel._Worksheet m_objSheet = null;    private Excel.Range m_objRange =  null;    private Excel.Font m_objFont = null;    private Excel.QueryTables m_objQryTables = null;    private Excel._QueryTable m_objQryTable = null;    // Frequenty-used variable for optional arguments.    private object m_objOpt = System.Reflection.Missing.Value;    // Paths used by the sample code for accessing and storing data.    private object m_strSampleFolder = "C:\\ExcelData\\";    private string m_strNorthwind = "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb";    private void Form1_Load(object sender, System.EventArgs e)    {    comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;    comboBox1.Items.AddRange(new object[]{    "Use Automation to Transfer Data Cell by Cell ",    "Use Automation to Transfer an Array of Data to a Range on a Worksheet ",    "Use Automation to Transfer an ADO Recordset to a Worksheet Range ",    "Use Automation to Create a QueryTable on a Worksheet",    "Use the Clipboard",    "Create a Delimited Text File that Excel Can Parse into Rows and Columns",    "Transfer Data to a Worksheet Using ADO.NET "});    comboBox1.SelectedIndex = 0;    button1.Text = "Go!";    }    private void button1_Click(object sender, System.EventArgs e)    {    switch (comboBox1.SelectedIndex)    {    case 0 : Automation_CellByCell(); break;    case 1 : Automation_UseArray(); break;    case 2 : Automation_ADORecordset(); break;    case 3 : Automation_QueryTable(); break;    case 4 : Use_Clipboard(); break;    case 5 : Create_TextFile(); break;    case 6 : Use_ADONET(); break;    }    //Clean-up    m_objFont = null;    m_objRange = null;    m_objSheet = null;    m_objSheets = null;    m_objBooks = null;    m_objBook = null;    m_objExcel = null;    GC.Collect();    }    private void Automation_CellByCell()    {    // Start a new workbook in Excel.    m_objExcel = new Excel.Application();    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;    m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));    // Add data to cells of the first worksheet in the new workbook.    m_objSheets = (Excel.Sheets)m_objBook.Worksheets;    m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));    m_objRange = m_objSheet.get_Range("A1", m_objOpt);    m_objRange.set_Value(m_objOpt,"Last Name");    m_objRange = m_objSheet.get_Range("B1", m_objOpt);    m_objRange.set_Value(m_objOpt,"First Name");    m_objRange = m_objSheet.get_Range("A2", m_objOpt);    m_objRange.set_Value(m_objOpt,"Doe");    m_objRange = m_objSheet.get_Range("B2", m_objOpt);    m_objRange.set_Value(m_objOpt,"John");    // Apply bold to cells A1:B1.    m_objRange = m_objSheet.get_Range("A1", "B1");    m_objFont = m_objRange.Font;    m_objFont.Bold=true;    // Save the workbook and quit Excel.    m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);    m_objBook.Close(false, m_objOpt, m_objOpt);    m_objExcel.Quit();    }    private void Automation_UseArray()    {    // Start a new workbook in Excel.    m_objExcel = new Excel.Application();    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;    m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));    m_objSheets = (Excel.Sheets)m_objBook.Worksheets;    m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));    // Create an array for the headers and add it to cells A1:C1.    object[] objHeaders = {"Order ID", "Amount", "Tax"};    m_objRange = m_objSheet.get_Range("A1", "C1");    m_objRange.set_Value(m_objOpt,objHeaders);    m_objFont = m_objRange.Font;    m_objFont.Bold=true;    // Create an array with 3 columns and 100 rows and add it to    // the worksheet starting at cell A2.    object[,] objData = new Object[100,3];    Random rdm = new Random((int)DateTime.Now.Ticks);    double nOrderAmt, nTax;    for(int r=0;r<100;r++)    {    objData[r,0] = "ORD" + r.ToString("0000");    nOrderAmt = rdm.Next(1000);    objData[r,1] = nOrderAmt.ToString("c");    nTax = nOrderAmt*0.07;    objData[r,2] = nTax.ToString("c");    }    m_objRange = m_objSheet.get_Range("A2", m_objOpt);    m_objRange = m_objRange.get_Resize(100,3);    m_objRange.set_Value(m_objOpt,"objData");    // Save the workbook and quit Excel.    m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);    m_objBook.Close(false, m_objOpt, m_objOpt);    m_objExcel.Quit();    }    private void Automation_ADORecordset()    {    // Create a Recordset from all the records in the Orders table.    ADODB.Connection objConn = new ADODB.Connection();    ADODB._Recordset objRS = null;    objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +    m_strNorthwind + ";", "", "", 0);    objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;    object objRecAff;    objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff,    (int)ADODB.CommandTypeEnum.adCmdTable);    // Start a new workbook in Excel.    m_objExcel = new Excel.Application();    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;    m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));    m_objSheets = (Excel.Sheets)m_objBook.Worksheets;    m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));    // Get the Fields collection from the recordset and determine    // the number of fields (or columns).    System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();    int nFields = objRS.Fields.Count;    // Create an array for the headers and add it to the    // worksheet starting at cell A1.    object[] objHeaders = new object[nFields];    ADODB.Field objField = null;    for(int n=0;n<nFields;n++)    {    objFields.MoveNext();    objField = (ADODB.Field)objFields.Current;    objHeaders[n] = objField.Name;    }    m_objRange = m_objSheet.get_Range("A1", m_objOpt);    m_objRange = m_objRange.get_Resize(1, nFields);    m_objRange.set_Value(m_objOpt,objHeaders);    m_objFont = m_objRange.Font;    m_objFont.Bold=true;    // Transfer the recordset to the worksheet starting at cell A2.    m_objRange = m_objSheet.get_Range("A2", m_objOpt);    m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);    // Save the workbook and quit Excel.    m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);    m_objBook.Close(false, m_objOpt, m_objOpt);    m_objExcel.Quit();    //Close the recordset and connection    objRS.Close();    objConn.Close();    }    private void Automation_QueryTable()    {    // Start a new workbook in Excel.    m_objExcel = new Excel.Application();    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;    m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));    // Create a QueryTable that starts at cell A1.    m_objSheets = (Excel.Sheets)m_objBook.Worksheets;    m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));    m_objRange = m_objSheet.get_Range("A1", m_objOpt);    m_objQryTables = m_objSheet.QueryTables;    m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(    "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +    m_strNorthwind + ";", m_objRange, "Select * From Orders");    m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;    m_objQryTable.Refresh(false);    // Save the workbook and quit Excel.    m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt);    m_objBook.Close(false, m_objOpt, m_objOpt);    m_objExcel.Quit();    }    private void Use_Clipboard()    {    // Copy a string to the clipboard.    string sData = "FirstName\tLastName\tBirthdate\r\n"  +    "Bill\tBrown\t2/5/85\r\n"  +    "Joe\tThomas\t1/1/91";    System.Windows.Forms.Clipboard.SetDataObject(sData);    // Start a new workbook in Excel.    m_objExcel = new Excel.Application();    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;    m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));    // Paste the data starting at cell A1.    m_objSheets = (Excel.Sheets)m_objBook.Worksheets;    m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));    m_objRange = m_objSheet.get_Range("A1", m_objOpt);    m_objSheet.Paste(m_objRange, false);    // Save the workbook and quit Excel.    m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt);    m_objBook.Close(false, m_objOpt, m_objOpt);    m_objExcel.Quit();    }    private void Create_TextFile()    {    // Connect to the data source.    System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");    objConn.Open();    // Execute a command to retrieve all records from the Employees  table.    System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand(    "Select * From Employees", objConn);    System.Data.OleDb.OleDbDataReader objReader;    objReader = objCmd.ExecuteReader();    // Create the FileStream and StreamWriter object to write    // the recordset contents to file.    System.IO.FileStream fs = new System.IO.FileStream(    m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);    System.IO.StreamWriter sw = new System.IO.StreamWriter(    fs, System.Text.Encoding.Unicode);    // Write the field names (headers) as the first line in the text file.    sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +    "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +    "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));    // Write the first six columns in the recordset to a text file as    // tab-delimited.    while(objReader.Read())    {    for(int i=0;i<=5;i++)    {    if(!objReader.IsDBNull(i))    {    string s;    s = objReader.GetDataTypeName(i);    if(objReader.GetDataTypeName(i)=="DBTYPE_I4")    {    sw.Write(objReader.GetInt32(i).ToString());    }    else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")    {    sw.Write(objReader.GetDateTime(i).ToString("d"));    }    else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")    {    sw.Write(objReader.GetString(i));    }    }    if(i<5) sw.Write("\t");    }    sw.WriteLine();    }    sw.Flush();	// Write the buffered data to the FileStream.    // Close the FileStream.    fs.Close();    // Close the reader and the connection.    objReader.Close();    objConn.Close();    // ==================================================================    // Optionally, automate Excel to open the text file and save it in the    // Excel workbook format.    // Open the text file in Excel.    m_objExcel = new Excel.Application();    m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;    m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1,    Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,    false, true, false, false, false, false, m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);    m_objBook = m_objExcel.ActiveWorkbook;    // Save the text file in the typical workbook format and quit Excel.    m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal,    m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,    m_objOpt, m_objOpt, m_objOpt);    m_objBook.Close(false, m_objOpt, m_objOpt);    m_objExcel.Quit();    }    private void Use_ADONET()    {    // Establish a connection to the data source.    System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +    "Book7.xls;Extended Properties=Excel 8.0;");    objConn.Open();    // Add two records to the table named 'MyTable'.    System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();    objCmd.Connection = objConn;    objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +    " values ('Bill', 'Brown')";    objCmd.ExecuteNonQuery();    objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +    " values ('Joe', 'Thomas')";    objCmd.ExecuteNonQuery();    // Close the connection.    objConn.Close();    }    }  // End Class    }// End namespace    
    注意:您必須更改 Visual Studio 2005 中的代碼。默認(rèn)情況下,當(dāng)創(chuàng)建一個(gè) Windows 窗體項(xiàng)目時(shí),Visual C# 會(huì)向該項(xiàng)目中添加一個(gè)窗體。該窗體被命名為 Form1。代表該窗體的兩個(gè)文件被命名為 Form1.cs 和 Form1.designer.cs。您在 Form1.cs 中編寫代碼。Form1.designer.cs 文件是 Windows 窗體設(shè)計(jì)器編寫代碼的地方,這些代碼可以實(shí)現(xiàn)通過拖放工具箱中的控件而執(zhí)行的所有操作。

    有關(guān) Visual C# 2005 中的 Windows 窗體設(shè)計(jì)器的更多信息,請(qǐng)?jiān)L問下面的 Microsoft Developer Network (MSDN) 網(wǎng)站:
    http://msdn2.microsoft.com/zh-cn/library/ms173077.aspx (http://msdn2.microsoft.com/zh-cn/library/ms173077.aspx)
    注意:如果您沒有將 Office 安裝到默認(rèn)文件夾 (C:\Program Files\Microsoft Office) 中,請(qǐng)修改代碼示例中的“m_strNorthwind”常量以匹配 Northwind.mdb 的安裝路徑。
  8. 將下面的代碼添加到 Form1.cs 中的“Using”指令中:
    	using System.Reflection;    using System.Runtime.InteropServices;    using Excel = Microsoft.Office.Interop.Excel;    
  9. 按 F5 生成并運(yùn)行該示例
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
安全數(shù)組操作excel
用DLL實(shí)現(xiàn)把數(shù)據(jù)庫的記錄導(dǎo)出到EXCEL中(VB) - 應(yīng)用程序 - VB教程
Excel導(dǎo)入,導(dǎo)出,模板生成
C#中使用Excel
asp.net導(dǎo)出Excel文件之方法比較
Winform導(dǎo)出Excel的列格式設(shè)置
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服