Help and Support
 

powered byLive Search

如何將資料傳送至 Excel 活頁簿藉由使用 Visual C# 2005 或 Visual C# . NET

文章編號:306023
上次校閱:2006年12月11日
版次:7.4
如 Microsoft Visual Basic . NET 版本的這份文件, 請參魷 \cs6 \f1 \cf6 \lang1024 306022 (http://support.microsoft.com/kb/306022/) .
如本篇文章, Microsoft Visual Basic 6.0 版本的請參魷 \cs6 \f1 \cf6 \lang1024 247412 (http://support.microsoft.com/kb/247412/) .
在此頁中

結論

本文將逐步告訴您了幾個方法可用來將資料傳送至 Microsoft Excel 2002 從 Microsoft Visual C# 2005 或 Microsoft Visual C# . NET 應用程式。 以便您可以選取方案最適合您的情況, 這份文件也提供優缺點的每個方法。

回此頁最上方

概觀

最常可用來將資料傳送至 Excel 活頁簿技術是 自動化 。 「 自動化 」, 您可以呼叫方法和屬性 that are specific 到 Excel 工作。 提供 Automation 為活頁簿中指定您的資料的位置、 活頁簿, 格式化和 Run - Time 進行各種設定最大的彈性。

「 自動化 」, 您可以使用數個技術, 將您的資料:
?依儲存格傳送資料.
?將陣列中的資料傳送至儲存格範圍.
?藉由使用 CopyFromRecordset 方法在 ADO 資料錄集的資料轉移到某個範圍的儲存格。
?ODBC (開放式資料庫連接) 或 OLEDB 資料來源上查詢的結果, 其中包含 Excel 工作表上建立一個 QueryTable 物件。
?將資料傳送至剪貼簿,再將剪貼簿的內容貼上 Excel 工作表.
您也可以使用數個方法, 不一定需要自動化, 將資料傳送至 Excel。 如果您正在執行伺服器端程式, 這可以是花大量的資料處理遠離您的用戶端對一個好方法。

將您的資料, 而不自動化, 可以使用下列方法:
?傳輸您的資料到一個定位點分隔或逗號分隔文字檔案, Excel 可以稍後再剖析到儲存格在工作表上。
?藉由使用 ADO . NET 傳送您的資料加入至工作表。
?傳送 XML 資料至 Excel (version 2002 和 2003, 以提供資料, 格式化並排列成資料列和資料行。
此外, 本文會提供為每一個這些技術的討論區及程式碼範例。 <B> 專門的 MIDL 程式碼中有一個錯誤 / mktyplib203 </B> 處理 建立完整範例 Visual C# 2005 或 Visual C# . NET 專案 稍後在本文, 一節將示範如何建立 Visual C# . NET 程式執行每個技術。

回此頁最上方

技術

使用 Automation 來傳輸資料藉由儲存格

「 自動化 」, 您可以將資料傳送到工作表儲存格在同一時間:
// 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();
				
如果您有小的資料量是由儲存格傳送資料的可接受的方法。 您需要彈性地將資料的任何地方將活頁簿中, 您可以格式化儲存格有條件地在 Run - Time。 不, 但是最好是若要使用這個方法如果您有大量的資料轉移到一份 Excel 活頁簿。 將每個 Range 物件, 在表示資料介面要求執行階段結果在你所取得的傳輸變慢了。 在介面要求除此之外, Microsoft Windows 95、 Microsoft Windows 98 和 Microsoft Windows Millennium Edition (Me) 有 64 千位元組 (KB) 限制。 如果您有超過 64 KB 的介面要求, Automation 伺服程式 (Excel) 可能會停止回應, 或您可能會收到錯誤訊息, 指出記憶體不足。 如需詳細資訊, 請按一下下面文件編號, 檢視 「 Microsoft 知識庫 」 中的文件中的文件:
216400 (http://support.microsoft.com/kb/216400/EN-US/) PRB: 跨處理序 (Cross - Process) COM 自動化可以停止回應 Win 95 / 98 上的用戶端應用程式
同樣地, 藉由儲存格傳送資料是可接受只適用於小型數量的資料。 如果您必須傳送大型資料集至 Excel, 請考慮使用的其他方法在本篇文章將在大量資料傳輸所述之一。

如並且如需有關使用 Visual C# . NET, 自動化 Excel 的範例的詳細資訊, 請按一下下面文件編號, 檢視 「 Microsoft 知識庫 」 中的文件中的文件:
302084 (http://support.microsoft.com/kb/302084/EN-US/) HOWTO: 自動化 Microsoft Excel 從 Microsoft Visual C# . NET

使用自動化來傳輸至某個範圍的陣列資料工作表上

您可以將資料的陣列傳送到某個範圍的多個儲存格在同一時間:
// 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();
				
如果您藉由使用陣列而不是依儲存格, 轉移您的資料您可以達成龐大的效能具有大量的資料。 請考慮下列幾行從先前提到的程式碼中, 將資料傳送至工作表中 300 個儲存格:
objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;
				
這段程式碼表示兩個介面要求: 一個用於 Range 物件, Range 方法會傳回, 另一個則用於 Range 物件, 調整大小 方法會傳回 相較之下, 藉由儲存格傳送資料需要要求為 300 個介面, 以 Range 物件。 可能的話,您可以從大量傳送資料,並且減少產生介面要求的數量中,獲得好處。.

如需有關使用陣列來取得和設定 「 自動化 」, Excel 範圍中的值請按一下下面文件編號, 檢視 「 Microsoft 知識庫 」 中的文件中的文件:
302096 (http://support.microsoft.com/kb/302096/EN-US/) HOWTO: 自動化 Excel with Visual C# . NET, 填滿或取得使用陣列範圍中資料

使用自動化來轉移到工作表範圍的 ADO 資料錄集

為 Excel 2000、 Excel 2002 及 Excel 2003 物件模型提供 CopyFromRecordset 方法, 讓工作表上的 ADO 資料錄集傳送至某個範圍。 下列程式碼會說明如何自動化 Excel 將藉由使用 CopyFromRecordset 方法轉送北風貿易範例資料庫中的 Orders 資料表內容:
// 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 資料錄集 物件。 您無法使用, 藉由使用 ADO . NET 具有 CopyFromRecordset 方法您建立資料 。 在之後的章節中數個範例會示範如何將資料傳送至 Excel 使用 ADO . NET。

使用 Automation 來建立工作表上的 QueryTable 物件

QueryTable 物件表示資料表從外部資料來源所傳回資料所建置。 當您自動化 Excel, 可以藉由提供連接字串以 SQL 字串的 OLE DB 或 ODBC 資料來源並建立 QueryTable 。 Excel 會產生資料錄集並將資料錄集插入工作表在由您指定的位置。 QueryTable 物件提供 CopyFromRecordset 方法下列優點:
?Excel 會處理建立的資料錄集及其位置在工作表上。
?您可以以 QueryTable 物件儲存查詢並重新整理它以取得更新的資料錄集更新的版本。
?當新 QueryTable 會加入至您的工作表, 您可以指定是已經存在於工作表上儲存格中的資料, 以處理新的資料移動 (如需詳細資訊, 請參魷 \cs6 \f1 \cf6 \lang1024 RefreshStyle 屬性)
下列程式碼示範如何自動化 Excel 2000、 Excel 2002 或 Excel 2003 利用來自 Northwind 範例資料庫資料來建立新 QueryTable 在 Excel 工作表中:
// 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 剪貼簿, 將資料傳送至工作表。 若要貼上資料分割成多個儲存格在工作表上, 您可以複製在其中會以 TAB 字元, 分隔資料行和資料列以換行字元 (Carriage Return) 分隔字串。 下列程式碼將說明如何 Visual C# . NET 可以使用 Windows 剪貼簿, 將資料傳送至 Excel:
// 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();
				

建立分隔文字檔, Excel 可以剖析成資料列和資料行

Excel 能夠開啟以 Tab 或逗號分隔的檔案,並且正確地將其中的資料剖析至儲存格中。. 當您要使用小, 如果有的話, 自動化時, 大量的資料轉移到工作表您可以使用這項功能。 可能是因為伺服器端所產生的文字檔可能會為用戶端伺服器程式一個好方法。 然後,您可以在適當的時候使用「自動化」,以便在用戶端開啟文字檔。.

下列程式碼會說明如何從使用 ADO . NET 會讀取的資料, 產生 - Tab 鍵分隔文字檔:
// 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(); 
				
上述程式碼會使用沒有自動化。 不過, 如果您要, 可以使用 Automation 來開啟文字檔並將檔案儲存在 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

您可以使用 Microsoft Jet OLE DB 提供者若要將資料錄加入資料表在現有的 Excel 活頁簿中。 在 Excel 表格 是只是某個範圍的儲存格 ; 範圍可能會有一個已定義的名稱。 通常, 第一列的範圍包含標頭 (或欄位名稱), 並範圍中的所有資料列更新的版本包含資料錄。

下列程式碼將兩個新資料錄至 Book7.xls 中的資料表。 在這個案例資料表是 Sheet 1:
// 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();
				
當您新增具有 ADO . NET 的記錄, 如這個範例, 所示是維護活頁簿中的格式設定。 每個資料錄加入至資料列的格式與資料列之前, 採用。

如需有關使用 ADO.NET 的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件::
306636 (http://support.microsoft.com/kb/306636/EN-US/) HOW TO: 連接至資料庫與藉由使用 ADO . NET 和 Visual C# . NET 執行命令
314145 (http://support.microsoft.com/kb/314145/EN-US/) HOW TO: 填入 (Populate) DataSet 物件從資料庫藉由使用 Visual C# . NET
307587 (http://support.microsoft.com/kb/307587/EN-US/) HOW TO:使用 Visual C# .NET 從 DataSet 物件中更新資料庫
如需有關使用 Excel 資料來源, 使用 Jet OLEDB 提供者詳細資訊請按一下下面文件編號, 檢視 「 Microsoft 知識庫 」 中的文件:
316934 (http://support.microsoft.com/kb/316934/EN-US/) HOW TO: 使用 ADO . NET 來擷取和修改一份 Excel 活頁簿在 Visual Basic . NET 中的資料錄
278973 (http://support.microsoft.com/kb/278973/EN-US/) SAMPLE: ExcelADO 示範如何使用 ADO 來讀取和寫入 Excel 活頁簿中的資料
257819 (http://support.microsoft.com/kb/257819/EN-US/) HOWTO: 使用 ADO 與 Visual Basic 或 VBA 來自 Excel 資料

傳送 XML 資料 (Excel 2002 和 Excel 2003)

Excel 2002 和 2003 可以開啟任何 XML 檔案是語式正確 (Well - Formed。 您可以藉直接由在 [ 檔案 ] 功能表, 使用 [ 開啟 ] 命令或以程式設計方式藉由使用 OpenXML 方法 Workbooks 集合的 [ 開啟 ] 或開啟 XML 檔案。 如果您在 Excel, 建立 XML 檔案以供使用也可以建立樣式表來格式化資料。

如需有關在 Excel 2002, 使用 XML 詳細資訊請按一下下面文件編號, 檢視 「 Microsoft 知識庫 」 中的文件:
307029 (http://support.microsoft.com/kb/307029/EN-US/) HOW TO: 將 XML 資料傳送至 Microsoft Excel 2002 藉由使用 Visual C# . NET
288215 (http://support.microsoft.com/kb/288215/EN-US/) INFO: Microsoft Excel 2002 及 XML

回此頁最上方

建立完整範例 Visual C# . NET 專案

1.建立名為 C:\ExcelData 新資料夾。 範例程式會將儲存 Excel 活頁簿在這個資料夾。
2.建立新的活頁簿如需範例, 將寫入:
a. 在 Excel 中啟動新的活頁簿。
b. 在 Sheet 1 的新活頁簿, 輸入 FirstName 在儲存格 A 1 和 LastName 在儲存格 B 1。
c. 選取 A 1: B 1。
d. 在 [ 插入 ] 功能表, 再指到 Name , 及 定義 。 鍵入名稱 MyTable 並按一下 [ 確定 ] 。
e. 儲存為活頁簿 C:\Exceldata\Book7.xls.
f. 結束 Excel。.
3.啟動 Microsoft Visual Studio 2005 或 Microsoft Visual Studio . NET。 在 [ 檔案 ] 功能表, 指向 New , 及 [ 專案 。 在 [ Visual C# 專案 ] 或 Visual C# , 選取 [ Windows 應用程式 。 根據預設會建立 Form1。.
4.將參考加入至 Excel 物件程式庫和 ADODB 主要 Interop 組件。 如果要執行這項操作,請依照下列步驟執行。:
a. 在 [ 專案 ] 功能表, 按一下 [ 加入參考 。
b. 在 . NET ] 索引標籤, ADODB , 尋找並按一下 [ 選取 。

請注意 在 Visual Studio 2005, 您沒有, 按一下 [ 選取
c. 在 [ COM ] 索引標籤, 找出 Microsoft Excel 10.0 Object Library 或 Microsoft Excel 11.0 Object Library , 並按一下 選取 。

請注意 在 Visual Studio 2005, 您沒有, 按一下 [ 選取

注意 如果您是使用 Microsoft Excel 2002 且您尚未如此, Microsoft 建議您下載並再安裝 Microsoft Office XP Primary Interop Assemblies (PIA)。 如需有關 Office XP PIA 的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件::
328912 (http://support.microsoft.com/kb/328912/) INFO: Microsoft Office XP PIA 可供下載
d. 在 [ 加入參考 ] 對話方塊, 按一下 [ 確定 ] 以接受您的選項。
5.將 下拉式方塊 控制項和 Button 控制項加入至 Form 1
6. 為 Form Load 事件, Button 控制項的 Click 事件加入事件處理常式:
a. 在 [ 設計 ] 檢視為 Form 1. cs, 連按兩下 Form 1 。

Form Load 事件處理常式建立, 並會出現在 Form 1. cs。
b. 在 [ 檢視 ] 功能表, 按一下 [ 設計工具 ] , 切換至設計檢視。
c. 連按兩下 Button 1 。

在按鈕的 Click 事件處理常式建立, 並會出現在 Form 1. cs。
7.在 Form 1. 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。 根據預設值, Visual C# 中, 將一個表單加入至專案當您建立 Windows Form 專案。 將表單命名為 Form 1。 將兩個檔案, 表示表單則名為 Form 1. cs 和 Form1.designer.cs。 在 Form 1. cs 您撰寫程式碼。 Form1.designer.cs 檔案是您執行利用從 [ 工具箱 ] 拖放控制項撰寫 Windows Form 設計工具實作所有動作的程式碼。

如需在 Visual C# 2005, [ Windows Form 設計工具的資訊請造訪下列 Microsoft Developer Network (MSDN) 網站:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
注意 如果您未安裝到預設的資料夾 (C: \Program Files \Microsoft Office), Office 修改程式碼範例, 以符合您的安裝路徑為 Northwind . mdb 中 m_strNorthwind 常數。
8.將下列 Using 指示詞在 Form 1. cs 加入:
	using System.Reflection;
	using System.Runtime.InteropServices;
	using Excel = Microsoft.Office.Interop.Excel;
					
9.按 F 5 以建置並執行範例。

回此頁最上方

REFERENCES

如需詳細資訊, 請造訪下列 Microsoft 網站:
Microsoft Office Development with Visual Studio (http://msdn2.microsoft.com/en-us/library/aa188489.aspx)

回此頁最上方


這篇文章中的資訊適用於:
?Microsoft Excel 2002 Standard Edition
?Microsoft Visual C# 2005
?Microsoft Visual C# .NET 2002 Standard Edition
?Microsoft ADO.NET 1.0

回此頁最上方

關鍵字:?
kbautomation kbhowtomaster KB306023 KbMtzh kbmt

回此頁最上方

機器翻譯重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。如果您發現錯誤,並想要協助我們進行改善,請填寫本篇文章下方的問卷。
按一下這裡查看此文章的英文版本:306023 (http://support.microsoft.com/kb/306023/en-us/)

回此頁最上方

Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

文章翻譯

 

Related Support Centers

Other Support Options

  • Need More Help?
    Contact a Support professional by Email, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.