共用方式為


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

如需本文的 Microsoft Visual Basic 6.0 版本,請 參閱247412

本逐步文章說明從 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程式將資料傳輸至 Microsoft Excel 2002 的數種方法。 本文也會說明每個方法的優缺點,讓您可以選取最適合您情況的解決方案。

概觀

最常用來將資料傳輸至 Excel 活頁簿的技術是自動化。 透過自動化,您可以呼叫 Excel 工作特有的方法和屬性。 自動化可讓您有最大的彈性來指定活頁簿中的資料位置、格式化活頁簿,以及在執行時間進行各種設定。

透過自動化,您可以使用數種技術來傳輸資料:

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

若要在不使用自動化的情況下傳輸資料,您可以使用下列方法:

  • 將您的資料傳輸至索引標籤分隔或以逗號分隔的文字檔,Excel 稍後可以剖析成工作表上的儲存格。
  • 使用 ADO.NET 將資料傳輸至工作表。
  • 將 XML 資料傳輸至 Excel (版本 2002 和 2003) ,以提供格式化並排列成資料列和資料行的資料。

本文提供每個技術的討論和程式碼範例。 The "Create the Complete Sample Visual C# 2005 or Visual C# .NET Project" section, later in this article, demonstrates how to create a Visual C# .NET program that executes each technique.

技術

使用自動化依儲存格傳輸資料格

透過自動化,您可以一次將資料傳輸到工作表一個儲存格:

// 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 (KB) 限制。 如果您有超過 64 KB 的介面要求,自動化伺服器 (Excel) 可能會停止回應,或者您可能會收到指出記憶體不足的錯誤訊息。

同樣地,只有少量資料可接受依資料格傳輸資料格。 如果您必須將大型資料集傳送至 Excel,請考慮使用本文中討論的其他方法之一來大量傳輸資料。

如需其他資訊,以及使用 Visual C# .NET 自動化 Excel 的範例,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:

302084 操作說明:從 Microsoft Visual C# .NET 自動化 Microsoft 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));
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 物件,另一個用於 Resize 方法傳回的 Range 物件。 相反地,依儲存格傳輸資料格需要 300 個介面的要求到 Range 物件。 可能的話,您可以受益于大量傳輸資料,並減少您提出的介面要求數目。

如需使用陣列取得及設定 Excel 自動化範圍內值的其他資訊,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:

302096 操作說明:使用 Visual C# .NET 將 Excel 自動化,以使用陣列填入或取得範圍中的資料

使用自動化將 ADO 記錄集傳輸至工作表範圍

Excel 2000、Excel 2002 和 Excel 2003 的物件模型會提供 CopyFromRecordset 方法,以將 ADO 記錄集傳輸至工作表上的範圍。 下列程式碼說明如何使用 CopyFromRecordset 方法,將 Excel 自動化,以傳輸 Northwind 範例資料庫中的 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 Recordset 物件。 您無法搭配 CopyFromRecordset 方法使用 ADO.NET 建立的 DataSet。 下列各節中的數個範例示範如何使用 ADO.NET 將資料傳輸至 Excel。

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

QueryTable 物件代表從外部資料源傳回的資料所建置的資料表。 當您將 Excel 自動化時,可以藉由提供連接字串給 OLE DB 或 ODBC 資料來源和 SQL 字串來建立 QueryTable。 Excel 會產生記錄集,並將記錄集插入工作表中您指定的位置。 QueryTable 物件提供下列優於 CopyFromRecordset 方法的優點:

  • Excel 會處理記錄集的建立及其在工作表上的位置。
  • 您可以使用 QueryTable 物件儲存查詢,並在稍後重新整理以取得更新的記錄集。
  • 將新的 QueryTable 新增至您的工作表時,您可以指定工作表儲存格中已存在的資料會移轉以處理新的資料 (以取得詳細資訊,請參閱 RefreshStyle 屬性) 。

下列程式碼示範如何使用 Northwind 範例資料庫中的資料,將 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 可以開啟定位字元或以逗號分隔的檔案,並正確地將資料剖析成儲存格。 當您想要將大量資料傳輸到工作表,但很少使用自動化時,可以使用這項功能。 對於用戶端-伺服器程式來說,這可能是一個不錯的方法,因為文字檔可以在伺服器端產生。 然後,您可以在用戶端開啟文字檔,在適當的情況下使用自動化。

下列程式碼說明如何從使用 ADO.NET 讀取的資料產生索引標籤分隔文字檔:

// 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 操作說明:使用 ADO.NET 和 Visual C# .NET 連線到資料庫並執行命令

314145 操作說明:使用 Visual C# .NET 從資料庫填入 DataSet 物件

307587 如何:使用 Visual C# .NET 從 DataSet 物件更新資料庫

如需搭配 Excel 資料來源使用 Jet OLEDB 提供者的其他資訊,請按一下下列文章編號以檢視 Microsoft 知識庫中的文章:

278973 範例:ExcelADO 示範如何使用 ADO 在 Excel 活頁簿中讀取和寫入資料

257819 操作說明:使用 ADO 搭配 Visual Basic 或 VBA 的 Excel 資料

在 Excel 2002 和 Excel 2003 (傳輸 XML 資料)

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

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

  1. 建立名為 C:\ExcelData 的新資料夾。 範例程式會將 Excel 活頁簿儲存在此資料夾中。

  2. 為要寫入的範例建立新的活頁簿:

    1. 在 Excel 中啟動新的活頁簿。
    2. 在新活頁簿的 Sheet1 上,于儲存格 B1 的儲存格 A1 和 LastName 中輸入 FirstName。
    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) 。

  5. 在 [新增參考] 對話方塊中,按一下 [確定] 以接受您的選擇。

  6. 將下拉式方塊控制項和按鈕控制項新增至 Form1。

  7. 新增表單載入事件的事件處理常式和 Button 控制項的 Click 事件:

    1. 在 Form1.cs 的設計檢視中,按兩下 Form1。

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

    按鈕 Click 事件的處理常式隨即建立,並出現在 Form1.cs 中。

  8. 在 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 中變更程式碼。 根據預設,當您建立Windows Forms專案時,Visual C# 會將一個表單新增至專案。 表單名為 Form1。 代表表單的兩個檔案名為 Form1.cs 和 Form1.designer.cs。 您可以在 Form1.cs 中撰寫程式碼。 Form1.designer.cs 檔案是 Windows Forms Designer 撰寫程式碼的位置,該程式碼會實作您從 [工具箱] 拖放控制項所執行的所有動作。

    如需 Visual C# 2005 中Windows Forms設計工具的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:

    建立 Project (Visual C#) 注意 如果您未將 Office 安裝到 C:\Program Files\Microsoft Office) (預設資料夾,請修改程式碼範例中的m_strNorthwind常數,以符合 Northwind.mdb 的安裝路徑。

  9. 將下列內容新增至 Form1.cs 中的 Using 指示詞:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. 按 F5 以建置及執行範例。

參考

如需詳細資訊,請造訪下列 Microsoft 網站:

使用 Visual Studio 進行 Microsoft Office 開發