日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

使用C# 向 Excel 工作薄傳輸數(shù)據(jù)

 命運(yùn)之輪 2010-05-06
本文分步介紹了多種從 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)化”功能,您可以使用多種方法來(lái)傳輸數(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)化”功能來(lái)向 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è)置。不過(guò),如果您具有大量需要傳輸?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í)庫(kù)中相應(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)考慮使用本文中討論的其他方法之一來(lái)批量地傳輸數(shù)據(jù)。

有關(guān)其他信息以及如何利用 Visual C# .NET 自動(dòng)運(yùn)行 Excel 的示例,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫(kù)中相應(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)通過(guò) Excel 自動(dòng)化并使用數(shù)組獲取和設(shè)置區(qū)域中的值的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫(kù)中相應(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 記錄集。下面的代碼說(shuō)明了如何使用“CopyFromRecordset”方法使 Excel 自動(dòng)運(yùn)行,以傳輸 Northwind 示例數(shù)據(jù)庫(kù)中的“訂單”表的內(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í),可以通過(guò)提供指向 OLE DB 或 ODBC 數(shù)據(jù)源的連接字符串和 SQL 字符串來(lái)創(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ù)庫(kù)中的數(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 剪貼板來(lái)向工作表傳輸數(shù)據(jù)。要將數(shù)據(jù)粘貼到工作表上的多個(gè)單元格中,可以復(fù)制具有以下格式的字符串:在該字符串中,列由制表符分隔,行由回車(chē)符分隔。下面的代碼說(shuō)明了 Visual C# .NET 如何使用 Windows 剪貼板來(lái)向 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 可以打開(kāi)由制表符或逗號(hào)分隔的文件并正確地將數(shù)據(jù)分析為單元格。當(dāng)您希望向工作表傳輸大量數(shù)據(jù)而只使用少量(如果有的話)自動(dòng)化功能時(shí),可以使用此功能。這對(duì)于客戶端-服務(wù)器程序而言可能是一個(gè)好方法,因?yàn)槲谋疚募梢栽诜?wù)器端生成。然后,可以在客戶端根據(jù)需要使用“自動(dòng)化”功能來(lái)打開(kāi)文本文件。

下面的代碼說(shuō)明了如何從利用 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();
上述代碼沒(méi)有使用“自動(dòng)化”功能。不過(guò),如果您愿意,您可以按如下方式使用“自動(dòng)化”功能來(lái)打開(kāi)文本文件,并以 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ū)域可能具有定義的名稱(chēng)。通常,區(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í)庫(kù)中相應(yīng)的文章:
306636  (http://support.microsoft.com/kb/306636/ ) 如何使用 ADO.NET 2005 和 Visual C# 2005 或者 ADO.NET 和 Visual C# .NET 連接到數(shù)據(jù)庫(kù)并運(yùn)行命令
314145  (http://support.microsoft.com/kb/314145/ ) 如何使用 Visual C# .NET 從數(shù)據(jù)庫(kù)填充 DataSet 對(duì)象
307587  (http://support.microsoft.com/kb/307587/ ) 如何使用 Visual C# 2005 或 Visual C# .NET 從 DataSet 對(duì)象更新數(shù)據(jù)庫(kù)
有關(guān)如何將 Jet OLEDB 提供程序與 Excel 數(shù)據(jù)源一起使用的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫(kù)中相應(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 來(lái)讀寫(xiě)數(shù)據(jù)
257819  (http://support.microsoft.com/kb/257819/ ) 如何在 Visual Basic 或 VBA 中使用 ADO 來(lái)處理 Excel 數(shù)據(jù)

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

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

有關(guān)如何將 XML 與 Excel 2002 一起使用的其他信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫(kù)中相應(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è)新工作簿,以供示例向其中寫(xiě)入數(shù)據(jù):
    1. 在 Excel 中啟動(dòng)一個(gè)新工作簿。
    2. 在新工作簿的 Sheet1 上,在單元格 A1 中鍵入 FirstName,在單元格 B1 中鍵入 LastName。
    3. 選擇 A1:B1。
    4. 在“插入”菜單上,指向“名稱(chēng)”,然后單擊“定義”。鍵入名稱(chēng) 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ì)象庫(kù)和 ADODB 主互操作程序集的引用。為此,請(qǐng)按照下列步驟操作:
    1. 在“項(xiàng)目”菜單上,單擊“添加引用”。
    2. 在“NET”選項(xiàng)卡上,找到“ADODB”,然后單擊“選擇”。

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

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

      注意:如果您正在使用 Microsoft Excel 2002,并且尚未這樣做,Microsoft 建議您下載并安裝 Microsoft Office XP 主互操作 程序集 (PIA)。 有關(guān) Office XP PIA 的更多信息,請(qǐng)單擊下面的文章編號(hào),以查看 Microsoft 知識(shí)庫(kù)中相應(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 中編寫(xiě)代碼。Form1.designer.cs 文件是 Windows 窗體設(shè)計(jì)器編寫(xiě)代碼的地方,這些代碼可以實(shí)現(xiàn)通過(guò)拖放工具箱中的控件而執(zhí)行的所有操作。

    有關(guān) Visual C# 2005 中的 Windows 窗體設(shè)計(jì)器的更多信息,請(qǐng)?jiān)L問(wèn)下面的 Microsoft Developer Network (MSDN) 網(wǎng)站:
    http://msdn2.microsoft.com/zh-cn/library/ms173077.aspx (http://msdn2.microsoft.com/zh-cn/library/ms173077.aspx)
    注意:如果您沒(méi)有將 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)行該示例

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多