文章編號: 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 Excel 2002 中,從 Microsoft Visual C# 2005年或 Microsoft Visual C#.NET 程式的幾個方法。 將這份文件也呈現每個方法的優缺點,讓您可以選取最適合您情況的解決方案。
概觀 通常用來傳送資料至 Excel 活頁簿的技巧會
自動化 。 使用自動化,您可以呼叫方法和屬性的特定 Excel 工作。 自動化可讓您指定活頁簿中的資料的位置、 此的活頁簿的格式設定和在執行階段進行各種設定最大的彈性。
自動化,您可以使用數種技巧來傳送您的資料:
傳輸資料的儲存格。 將陣列中的資料轉移到儲存格範圍。 要將 ADO 資料錄集資料轉移到儲存格範圍,利用 CopyFromRecordset 方法。 您可以建立 QueryTable 物件的 Excel 工作表包含了 ODBC 或 OLEDB 資料來源查詢的結果。 傳輸資料到剪貼簿,並再貼到 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/
)
如何: 自動化 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/
)
如何: 自動化 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 物件的資料庫
如需有關使用 Excel 資料來源的 Jet OLEDB 提供者的其他資訊,請按一下 [下面的文件編號,檢視 「 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/
)
如何: 使用 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 專案 建立一個名為 C:\ExcelData 的新資料夾。 範例程式會儲存在此資料夾中的 Excel 活頁簿。 建立新的活頁簿寫入範例:啟動新的活頁簿,Excel 中。 新的活頁簿的 Sheet1 請在 [儲存格 A1] 和 [儲存格 B1 中的 姓氏 ] 中輸入 名字 。 選取 A1:B1。 在 [ 插入 ] 功能表上指向 [ 名稱 ],然後按一下 [ 定義 ]。 輸入 MyTable 名稱,然後再按一下 [確定] 。 將活頁簿儲存為 C:\Exceldata\Book7.xls 。 請結束 Excel。 啟動 Microsoft Visual Studio 2005 或 Microsoft Visual Studio.NET 中執行。 在 [ 檔案 ] 功能表上指向 [ 新增 ,] 然後按一下 [ 專案 ]。 在 [ Visual C# 專案 或 Visual C# ,之下選取 [ Windows 應用程式 ]。 根據預設值,會建立 Form1。 加入 Excel 物件程式庫與 ADODB 主要 Interop 組件參考。 要這麼做,請您執行下列步驟:在 [ 專案 ] 功能表上按一下 [ 加入參考 ]。 在 [ NET 索引標籤上找到 ADODB ,再按 選取 。 附註 在 Visual 的 Studio 2005 中您不必按一下 [ 選取] 。 [ 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 可供下載
在 加入參考 ] 對話方塊中,按一下 [ 確定 ] 接受您的選取項目]。 將 下拉式方塊 控制項和 按鈕 ] 控制項加入 Form1。 新增表單 負載 事件, 按一下 [按鈕] 控制項的事件的事件處理常式: 在設計檢視的 Form1.cs,連按兩下 [ Form1 ]。 表單的 Load 事件處理常式會建立並 Form1.cs 中會出現。 在 [ 檢視 ] 功能表中上, 按一下 [切換至設計檢視表 設計工具 ]。 連按兩下 [ Button1 ]。 按鈕的 Click 事件處理常式會建立並 Form1.cs 中會出現。 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) 的網站]: 附註 如果您沒有安裝 Office 預設資料夾 (C:\Program Files\Microsoft Office),修改程式碼範例以符合您的安裝路徑的 Northwind.mdb m_strNorthwind 常數。 將下列加入 使用 指示詞中 Form1.cs:
using System.Reflection;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
按 F5 以建置並執行範例。 參考 如需詳細資訊請造訪下列 Microsoft 網站]:
這篇文章中的資訊適用於: 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及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
為確保您的隱私權,在意見表中請勿包含您的連絡資訊。
謝謝您!您的意見將協助我們改進支援內容。如需更多協助選項,請造訪
說明及支援首頁 。