文章編號: 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 工作的屬性。 自動化可讓您在活頁簿中指定資料的位置、 格式化的活頁簿和在執行階段進行各種設定最大的彈性。
您可以使用自動化,一些技巧來傳送您的資料:
傳送資料的儲存格。 傳送至的儲存格範圍的陣列中的資料。 使用 CopyFromRecordset 方法中傳送至的儲存格範圍的 ADO 資料錄集的資料。 如果要在包含的 ODBC 或 OLEDB 資料來源上查詢的結果的 Excel 工作表上,建立 QueryTable 物件。 將資料傳送至的剪貼簿,並接著將 [剪貼簿] 內容貼入 Excel 工作表。 您也可以使用數種方法不一定需要,將資料傳送至 Excel 的自動化。 如果您執行伺服器端程式,這可以是從您的用戶端的資料處理大量的一個很好的方法。
若要傳送您的資料,而自動化,您可以使用下列方法:
您資料轉送到] 索引標籤的分隔或逗點分隔的文字檔,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();
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 Millennium Edition (Me) 具有 64 KB 限制在介面的要求。 如果您超過 64 KB 的介面要求請 Automation 伺服器 (Excel) 可能會停止將回應,或您可能會收到錯誤訊息,指出記憶體不足。 如需詳細資訊請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
216400 ?
(http://support.microsoft.com/kb/216400/EN-US/
)
PRB: 跨處理序 COM Automation Can Hang 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 物件。 相較之下,傳送資料的儲存格的儲存格
範圍 物件的 300 個介面需要要求。 盡可能,您可以將其可以從傳送大量的資料,及減少您的介面要求的數目。
如其他有關使用 [陣列] 來取得,並在使用 Excel 自動化的範圍中設定值的資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
302096 ?
(http://support.microsoft.com/kb/302096/EN-US/
)
HOWTO: 自動化 Excel 使用 Fill,或取得在使用陣列範圍的資料至 Visual C#.NET
使用自動化到工作表範圍中傳輸的 ADO 資料錄集 在 Excel 2000、 Excel 2002 和 Excel 2003 物件模型會提供在工作表上,將 ADO 資料錄集傳送至範圍,
CopyFromRecordset 方法。 下列程式碼說明如何自動化 Excel 使用
CopyFromRecordset 方法,以傳送 「 北風樣本資料庫中 Orders 資料表的內容:
// Create a Recordset from all the records in the Orders table.
ADODB.Connection objConn = new ADODB.Connection();
ADODB._Recordset objRS = null;
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_strNorthwind + ";", "", "", 0);
objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
object objRecAff;
objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff,
(int)ADODB.CommandTypeEnum.adCmdTable);
// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
// Get the Fields collection from the recordset and determine
// the number of fields (or columns).
System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
int nFields = objRS.Fields.Count;
// Create an array for the headers and add it to the
// worksheet starting at cell A1.
object[] objHeaders = new object[nFields];
ADODB.Field objField = null;
for(int n=0;n<nFields;n++)
{
objFields.MoveNext();
objField = (ADODB.Field)objFields.Current;
objHeaders[n] = objField.Name;
}
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objRange = m_objRange.get_Resize(1, nFields);
m_objRange.Value = objHeaders;
m_objFont = m_objRange.Font;
m_objFont.Bold=true;
// Transfer the recordset to the worksheet starting at cell A2.
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();
// Close the recordset and connection.
objRS.Close();
objConn.Close();
請注意 CopyFromRecordset 只適用於 ADO
資料錄集 物件。 您不能使用
DataSet 所建立 ADO.NET 中使用
CopyFromRecordset 方法。 下列章節中的數個範例會示範如何將資料傳送至 Excel with ADO.NET。
使用自動化在工作表上,建立一個 QueryTable 物件 A
QueryTable 物件將代表您,從外部資料來源所傳回的資料所建置的表格。 當您將 Excel 自動化時,您可以建立
QueryTable 藉由提供的 OLE DB 或 ODBC 資料來源,並在 SQL 字串的連接字串。 Excel 會產生資料錄集,並插入工作表,在您所指定的位置上的資料錄集。
QueryTable 物件下列優點,
CopyFromRecordset 方法:
Excel 會處理建立資料錄集及其在工作表上的位置。 您可以儲存查詢與 QueryTable 物件,並重新整理更新版本,以取得的更新資料錄集。 當新的 QueryTable 加入至您的工作表時,可以指定處理新的資料要移動已存在於工作表上儲存格的資料 (如需詳細資訊,請參閱 RefreshStyle 屬性)。 下列程式碼會示範如何自動化 Excel 2000、 Excel 2002 或 Excel 2003 使用 Northwind 範例資料庫中的資料,在 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();
m_objBook.SaveAs (m_strSampleFolder +"Book4.xls 」,m_objOpt m_objOpt m_objOpt、 m_objOpt,m_objOpt,Excel.XlSaveAsAccessMode.xlNoChange,m_objOpt、 m_objOpt m_objOpt、 m_objOpt) m_objBook.Close (false m_objOpt、 m_objOpt) ; m_objExcel.Quit();
使用 [Windows 剪貼簿] 您可以使用 [Windows 剪貼簿] 將資料傳送至工作表。 如果要將資料貼至工作表上的多個儲存格中,您可以複製中請在由 TAB 鍵的字元所分隔的資料行,及歸位字元 (Carriage Return) 傳回的分隔的資料列中的字串。 下列程式碼會示範 Visual C#.NET 要如何使用 [Windows 剪貼簿],將資料傳送至 Excel:
// Copy a string to the Windows clipboard.
string sData = "FirstName\tLastName\tBirthdate\r\n" +
"Bill\tBrown\t2/5/85\r\n" +
"Joe\tThomas\t1/1/91";
System.Windows.Forms.Clipboard.SetDataObject(sData);
// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
// Paste the data starting at cell A1.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objSheet.Paste(m_objRange, false);
// Save the workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();
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();
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();
objConn.Close() ; 當您可以將使用 ADO.NET,活頁簿中的格式設定這個範例中所示的資料錄維護。 每個加入至資料列的資料錄會採用,從之前的資料列的格式。
如其他有關使用 ADO.NET 的資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
306636 ?
(http://support.microsoft.com/kb/306636/EN-US/
)
HOW TO: 連接資料庫的並使用 ADO.NET 和 Visual C#.NET 中執行命令
314145 ?
(http://support.microsoft.com/kb/314145/EN-US/
)
HOW TO: 使用 Visual C#.NET 中填入一個 DataSet 物件,從資料庫
307587 ?
(http://support.microsoft.com/kb/307587/EN-US/
)
HOW TO: 使用 Visual C#.NET 中更新從 DataSet 物件的資料庫
如其他有關使用 Jet OLEDB 提供者與 Excel 資料來源的資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
316934 ?
(http://support.microsoft.com/kb/316934/EN-US/
)
HOW TO: 使用 ADO.NET,以擷取和修改 Visual Basic.NET 使用的 Excel 活頁簿中的資料錄
278973 ?
(http://support.microsoft.com/kb/278973/EN-US/
)
SAMPLE: ExcelADO 示範如何使用 ADO 讀取和寫入資料的 Excel 活頁簿
257819 ?
(http://support.microsoft.com/kb/257819/EN-US/
)
HOWTO: 將 ADO 使用 Excel 的資料,從 Visual Basic 或 VBA
傳輸 (Excel 2002 和 Excel 2003) 的 XML 資料 Excel 2002 和 2003,可以開啟是語式正確 (Well-Formed) 任何 XML 檔案。 您可以直接使用 [
開啟 ] 命令
檔案 ] 功能表上或以程式設計方式使用
[開啟] 或
活頁簿 集合的
OpenXML 方法,開啟 XML 檔案。 如果您在 Excel 中建立使用 XML 檔案,您也可以建立樣式表來格式化資料。
如其他有關使用 Excel 2002 中使用 XML 的資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
307029 ?
(http://support.microsoft.com/kb/307029/EN-US/
)
HOW TO: 傳輸的 XML 資料到 Microsoft Excel 2002 by Using Visual C#.NET
288215 ?
(http://support.microsoft.com/kb/288215/EN-US/
)
INFO: 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 Object Library] 或 [Microsoft Excel 11.0 物件的程式庫 ,然後按一下 [ 選取 ]。 請注意 在 Visual Studio 2005 中,您不必按一下 [選取 ]。 請注意 如果您使用的 Microsoft Excel 2002,且您尚未這樣,則 Microsoft 會建議您下載並再安裝 [Microsoft Office XP Primary Interop Assemblies (PIA (英文)。 如需 Office XP primary interop assemblies (PIAs,請按一下下面的文件編號,,檢視 「 Microsoft 知識庫 」 中的文件]: 328912 ?
(http://support.microsoft.com/kb/328912/
)
INFO: Microsoft Office XP PIA 可用的下載
在 [ 加入參考 對話方塊] 方塊中,按一下 [確定] 以接受您的選擇 (英文)。 請新增一個 下拉式清單方塊 控制項和 Button 控制項至 Form1。 加入表單的 Load 事件] 和 [按鈕控制項的 Click 事件的事件處理常式: 在設計檢視的 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 設計工具將程式碼實作所有的動作,您由拖放控制項從工具箱。 在 Visual C# 2005 中,Windows Form 設計工具的相關資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站: 請注意 如果預設資料夾 (C:\ Program Files \ Microsoft Office) 並未安裝 Office,修改 [程式碼範例以符合您的安裝路徑的 Northwind.mdb 中的 m_strNorthwind 常數]。 將下列加入 Using 指示詞,在 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及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。