文章編號: 306023 - 上次校閱: 2006年12月11日 - 版次: 7.5

如何使用 Visual C# 2005年或 Visual C#.NET 傳輸資料到 Excel 活頁簿

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
本文章的有 Microsoft Visual Basic.NET] 版本請參閱 306022? (http://support.microsoft.com/kb/306022/ )
本文章的有 Microsoft Visual Basic 6.0] 版本請參閱 247412? (http://support.microsoft.com/kb/247412/ )

在此頁中

全部展開 | 全部摺疊

結論

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

概觀

最常用來將資料傳送至 Excel 活頁簿的技巧會 自動化。使用自動化,您可以呼叫方法和 Excel 任務特有的屬性。自動化可讓您在活頁簿中指定您資料的位置、 該活頁簿的格式設定和在執行階段進行各種設定最大的彈性。

自動化,您可以使用數種技巧?傳送您的資料:
  • 傳輸資料的儲存格。
  • 將陣列中的資料傳送至儲存格範圍。
  • 將 ADO 資料錄集的資料轉移到某範圍的儲存格,利用 CopyFromRecordset 方法。
  • 建立 QueryTable 物件包含了 ODBC 或 OLEDB 資料來源中的查詢結果的 Excel 工作表上。
  • 將資料傳送至剪貼簿,然後將剪貼簿內容貼到 Excel 工作表。
您也可以使用數種方法不一定需要傳輸資料到 Excel 的自動化。如果您正在執行伺服器端程式,這可以是拍攝遠離您的用戶端的資料處理大量的一個好方法。

要傳送您的資料,而不需自動化,您可以使用下列方法:
  • 您資料傳送至 Tab 分隔或逗號分隔文字檔案,Excel 可以稍後再剖析成儲存格在工作表上。
  • 使用 ADO.NET 資料傳送到工作表中。
  • 將 XML 資料傳送至 Excel (版本 2002年和 2003年) 提供被格式化和排列在資料列和資料行的資料。
本文提供這些技巧的每個討論區] 和 [程式碼範例。稍後的這篇文章 「 Create the Complete Sample Visual C# 2005 or Visual C# .NET Project 一節會示範如何建立執行每個技術的 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));

// 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();
				
傳輸資料的儲存格是可接受的方法,如果您有小數量的資料。有彈性,活頁簿中的任何位置放置資料,而且您可以格式化儲存格有條件地在執行階段。然而,它不是個不錯的想法,如果您有大量要傳送至 Excel 活頁簿資料使用這種方法。取得在執行階段結果表示資料的介面要求中每個 Range 物件傳輸更慢。此外,Microsoft Windows 95、 Microsoft Windows 98 和 Microsoft Windows 千禧版 (Me) 請介面要求上有 64 千位元組 (KB) 限制。如果您超過 64 KB 的介面要求 「 自動化 」 伺服器 (Excel) 可能會停止回應,或者您可能會收到錯誤訊息,指出記憶體不足。 如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
216400? (http://support.microsoft.com/kb/216400/EN-US/ ) PRB: 跨處理序 COM 自動化可以掛上 Win95/98 的用戶端應用程式
同樣地,轉送資料依儲存格是可接受只進行小數量的資料。如果您必須將大型資料集傳送至 Excel,請考慮使用其他傳輸大量的資料,本文所討論的方法之一。

其他資訊和範例的自動化 Excel 以 Visual C#.NET,按一下面的文件編號,檢視 「 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 以 Visual C#.NET 填滿或取得使用陣列的範圍中的資料

會使用自動化將 ADO 資料錄集傳輸到工作表範圍

Excel 2000、 Excel 2002 及 Excel 2003 物件模型提供 CopyFromRecordset 方法,用於傳輸到範圍的 ADO 資料錄集工作表上。下列程式碼將說明如何自動化 Excel 使用 CopyFromRecordset 方法傳送北風貿易範例資料庫中的 [訂貨主檔] 資料表的內容:
// 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。

使用自動化,在工作表上建立一個 QueryTable 物件

一個 QueryTable 物件代表透過從外部資料來源傳回的資料所建立的表格。當您自動化 Excel 時,您可以建立 QueryTable 藉由提供連接字串的 OLE DB 或 ODBC 資料來源並 SQL 字串。Excel 會產生資料錄集並將資料錄集插入工作表在您指定的位置。QueryTable 物件提供下列勝於 CopyFromRecordset 方法的優勢:
  • Excel 會處理資料錄集和它的位置在工作表上的建立。
  • 您可以儲存查詢與 QueryTable 物件,並重新整理它稍後以取得更新的資料錄集。
  • 當新 QueryTable 新增至您的工作表時,您可以指定已存在於工作表上的儲存格的資料會移至處理新的資料 (如需詳細資訊請參閱 RefreshStyle 屬性])。
下列程式碼會示範如何自動化 Excel 2000、 Excel 2002 或 Excel 2003 使用北風貿易範例資料庫中的資料,在 Excel 工作表中建立新 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 剪貼簿] 來將資料傳送至工作表。若要將資料貼到工作表上的多個儲存格,您可以複製其中由 TAB 字元所分隔的資料行及由換行字元行字元分隔的資料列是字串。下列程式碼將說明 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(); 
				
先前提到的程式碼使用沒有自動化。不過,如果您想要您可以使用自動化您要開啟文字檔案,並將檔案儲存於 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 在資料表中加入兩個新的記錄。表格在這種情況下是 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();
				
當如這個範例所示,您可以新增記錄具有 ADO.NET 時,維護活頁簿中格式設定。每個新增的資料列的記錄會採用從它前面資料列格式。

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

傳輸 XML 資料 (Excel 2002 及 Excel 2003)

Excel 2002 及 2003年可以開啟任何語式正確的 XML 檔案。直接使用 [開啟] 指令在 [檔案] 功能表上,或以程式設計的方式使用 開啟活頁簿 集合的 OpenXML 方式,您可以開啟 XML 檔案。如果您在 Excel 中建立使用的 XML 檔案,也可以建立樣式表來格式化資料。

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

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

  1. 建立一個名為 C:\ExcelData 的新資料夾。範例程式會將 Excel 活頁簿儲存在此資料夾。
  2. 建立新的活頁簿寫入範例:
    1. 在 Excel 中啟動新的活頁簿。
    2. 新的活頁簿的 Sheet1 請在儲存格 A1 和儲存格 B1 中的 [姓氏] 中輸入 名字
    3. 選取 A1:B1。
    4. 在 [插入] 功能表上指向 [名稱,然後再按 [定義]。輸入 MyTable 名稱,然後按一下 [確定]
    5. 將活頁簿儲存為 C:\Exceldata\Book7.xls
    6. 請結束 Excel。
  3. 啟動 Microsoft Visual Studio 2005 或 Microsoft Visual Studio.NET。在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。在 Visual C# 專案Visual C# 下, 選取 [Windows 應用程式]。依照預設值,會建立 Form1。
  4. 將參考加入至 Excel 物件程式庫和 ADODB 主要 Interop 組件。要這麼做,請您執行下列步驟:
    1. 在 [專案] 功能表上按一下 [加入參考]。
    2. NET] 索引標籤上找到 ADODB,然後按一下 [選取]。

      附註在 Visual 的 Studio 2005 中並不需要按一下 [選取
    3. 在 [COM] 索引標籤上找到 Microsoft Excel 10.0 物件程式庫或 Microsoft Excel 11.0 物件程式庫,然後按一下 [選取]。

      附註在 Visual 的 Studio 2005 中並不需要按一下 [選取

      附註如果您使用 Microsoft Excel 2002,而且您已經不這樣做,Microsoft 建議您下載並安裝 [Microsoft Office XP 主要 Interop 組件 (PIA)。如需有關 Office XP PIA,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
      328912? (http://support.microsoft.com/kb/328912/ ) 資訊: Microsoft Office XP PIA 可供下載
    4. 在 [加入參考] 對話方塊中,按一下 [確定] 以接受您的選擇。
  5. 下拉式方塊 控制項和 按鈕] 控制項加入 Form1。
  6. 新增表單 負載 事件] 與 [按一下] 事件的 Button 控制項的事件處理常式:
    1. 在 [設計] 檢視的 Form1.cs,按兩下 Form1

      表單的 Load 事件處理常式會建立,並出現在 Form1.cs。
    2. 按一下 [檢視] 功能表以切換至設計檢視 表設計工具
    3. 連按兩下 [Button1]。

      按鈕的 Click 事件處理常式會建立,並出現在 Form1.cs。
  7. In Form1.cs, replace the following code:
    private void Form1_Load(object sender, System.EventArgs e)
    {
    
    }
    
    private void button1_Click(object sender, System.EventArgs e)
    {
    
    }
    					
    with:
            // 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 專案時。表單名為 Form1。代表表單的兩個檔案被命名 Form1.cs 和 Form1.designer.cs。Form1.cs 中撰寫程式碼。Form1.designer.cs 檔案是其中 Windows Form 設計工具寫入程式碼會實作所有動作您執行藉由拖放控制項從 [工具箱]。

    如需有關 Windows Form 設計工具在 Visual C# 2005年中的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
    http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
    附註如果您沒有安裝 Office 到預設資料夾 (C:\Program Files\Microsoft Office),修改 m_strNorthwind 常數在程式碼範例,以符合您的安裝路徑的 Northwind.mdb。
  8. 將下列程式碼加入至 Using 指示詞,在 Form1.cs:
    	using System.Reflection;
    	using System.Runtime.InteropServices;
    	using Excel = Microsoft.Office.Interop.Excel;
    					
  9. 按下 F5 以建置並執行範例。

參考

如需詳細資訊請造訪下列 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
關鍵字:?
kbmt kbautomation kbhowtomaster KB306023 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:306023? (http://support.microsoft.com/kb/306023/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。