(转)如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据

概要

本文分步介绍了多种从 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 传输数据的方法。本文还提供了每种方法的优点和缺点,以便您可以选择最适合您的情况的解决方案。

概述

最常用于向 Excel 工作簿传输数据的方法是“自动化”。利用“自动化”功能,您可以调用特定于 Excel 任务的方法和属性。“自动化”功能为您提供了指定数据在工作簿中所处的位置、将工作簿格式化以及在运行时进行各种设置的最大的灵活性。

利用“自动化”功能,您可以使用多种方法来传输数据:
逐个单元格地传输数据。
将数组中的数据传输到单元格区域。
使用“CopyFromRecordset”方法向单元格区域传输 ADO 记录集中的数据。
在 Excel 工作表上创建一个“QueryTable”对象,该对象包含对 ODBC 或 OLEDB 数据源进行查询的结果。
将数据传输到剪贴板,然后将剪贴板内容粘贴到 Excel 工作表中。
还可以使用多种未必需要利用“自动化”功能来向 Excel 传输数据的方法。如果您正在运行服务器端程序,这会是一种将批量数据处理从客户端移走的好方法。

要在不使用“自动化”功能的情况下传输数据,您可以使用下列方法:
将数据传输到制表符分隔的或逗号分隔的文本文件,然后 Excel 可以将该文本文件分析为工作表上的单元格。
使用 ADO.NET 将数据传输到工作表。
将 XML 数据传输到 Excel(仅限于 2002 和 2003 版)以提供可以被格式化和排列为行和列的数据。
本文讨论了其中的每一种方法并提供了每一种方法的代码示例。本文的 创建完整的示例 Visual C# 2005 或 Visual C# .NET 项目一节(在本文稍后部分)演示了如何创建执行每一种方法的 Visual C# .NET 程序。

方法

使用“自动化”功能逐单元格传输数据
利用“自动化”功能,您可以逐单元格地向工作表传输数据:
 1None.gif// Start a new workbook in Excel.
 2None.gifm_objExcel = new Excel.Application();
 3None.gifm_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
 4None.gifm_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
 5None.gif
 6None.gif// Add data to cells in the first worksheet in the new workbook.
 7None.gifm_objSheets = (Excel.Sheets)m_objBook.Worksheets;
 8None.gifm_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
 9None.gifm_objRange = m_objSheet.get_Range("A1", m_objOpt);
10None.gifm_objRange.Value = "Last Name";
11None.gifm_objRange = m_objSheet.get_Range("B1", m_objOpt);
12None.gifm_objRange.Value = "First Name";
13None.gifm_objRange = m_objSheet.get_Range("A2", m_objOpt);
14None.gifm_objRange.Value = "Doe";
15None.gifm_objRange = m_objSheet.get_Range("B2", m_objOpt);
16None.gifm_objRange.Value = "John";
17None.gif
18None.gif// Apply bold to cells A1:B1.
19None.gifm_objRange = m_objSheet.get_Range("A1""B1");
20None.gifm_objFont = m_objRange.Font;
21None.gifm_objFont.Bold=true;
22None.gif
23None.gif// Save the Workbook and quit Excel.
24None.gifm_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
25None.gif    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
26None.gif    m_objOpt, m_objOpt, m_objOpt, m_objOpt);
27None.gifm_objBook.Close(false, m_objOpt, m_objOpt);
28None.gifm_objExcel.Quit();
29None.gif
如果您具有少量的数据,则逐单元格地传输数据是可以接受的方法。您可以灵活地将数据放到工作簿中的任何地方,并可以在运行时根据条件对单元格进行格式设置。不过,如果您具有大量需要传输到 Excel 工作簿的数据,则使用这种方法不是一个好主意。您在运行时获取的每一个“Range”对象都会产生一个接口请求,这意味着数据传输速度会变得较慢。此外,Microsoft Windows 95、Microsoft Windows 98 以及 Microsoft Windows Millennium Edition (Me) 都对接口请求有 64 KB 的限制。如果您具有 64 KB 以上的接口请求,则“自动化”服务器 (Excel) 可能会停止响应,或者您可能会收到指出内存不足的错误消息。 Win95/98 上的进程间 COM 自动化可使客户端应用程序挂起 需要再次强调的是,逐单元格地传输数据仅对少量数据而言才可以接受。如果您必须向 Excel 传输大型数据集,则应考虑使用本文中讨论的其他方法之一来批量地传输数据。

有关其他信息以及如何利用 Visual C# .NET 自动运行 Excel 的示例,请单击下面的文章编号,以查看 
使用“自动化”功能将数据数组传输到工作表上的区域
可以将数据数组一次性地传输到由多个单元格组成的区域:
 1None.gif// Start a new workbook in Excel.
 2None.gifm_objExcel = new Excel.Application();
 3None.gifm_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
 4None.gifm_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
 5None.gifm_objSheets = (Excel.Sheets)m_objBook.Worksheets;
 6None.gifm_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
 7None.gif
 8None.gif// Create an array for the headers and add it to cells A1:C1.
 9ExpandedBlockStart.gifContractedBlock.gifobject[] objHeaders = dot.gif{"Order ID""Amount""Tax"};
10None.gifm_objRange = m_objSheet.get_Range("A1""C1");
11None.gifm_objRange.Value = objHeaders;
12None.gifm_objFont = m_objRange.Font;
13None.gifm_objFont.Bold=true;
14None.gif
15None.gif// Create an array with 3 columns and 100 rows and add it to
16None.gif// the worksheet starting at cell A2.
17None.gifobject[,] objData = new Object[100,3];
18None.gifRandom rdm = new Random((int)DateTime.Now.Ticks);
19None.gifdouble nOrderAmt, nTax;
20None.giffor(int r=0;r<100;r++)
21ExpandedBlockStart.gifContractedBlock.gifdot.gif{
22InBlock.gif    objData[r,0= "ORD" + r.ToString("0000");
23InBlock.gif    nOrderAmt = rdm.Next(1000);
24InBlock.gif    objData[r,1= nOrderAmt.ToString("c");
25InBlock.gif    nTax = nOrderAmt*0.07;
26InBlock.gif    objData[r,2= nTax.ToString("c");
27ExpandedBlockEnd.gif}

28None.gifm_objRange = m_objSheet.get_Range("A2", m_objOpt);
29None.gifm_objRange = m_objRange.get_Resize(100,3);
30None.gifm_objRange.Value = objData;
31None.gif
32None.gif// Save the Workbook and quit Excel.
33None.gifm_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
34None.gif    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
35None.gif    m_objOpt, m_objOpt, m_objOpt, m_objOpt);
36None.gifm_objBook.Close(false, m_objOpt, m_objOpt);
37None.gifm_objExcel.Quit();
38None.gif
如果您使用数组而不是逐单元格地传输数据,则在传输大量数据时,传输性能会大大地增强。请考虑前面代码中的下面几行,这些行将数据传输到工作表中的 300 个单元格:
1None.gifobjRange = objSheet.get_Range("A2", m_objOpt);
2None.gifobjRange = objRange.get_Resize(100,3);
3None.gifobjRange.Value = objData;
4None.gif
上面的代码代表了两个接口请求:一个请求是针对“Range”方法返回的“Range”对象,另一个请求是针对“Resize”方法返回的“Range”对象。相比之下,逐单元格地传输数据却需要对“Range”对象发出 300 个接口请求。只要有可能,您就可以从批量地传输数据以及减少所发出的接口请求的数量当中受益。

有关通过 Excel 自动化并使用数组获取和设置区域中的值的其他信息,请单击下面的文章编号,以查看
使用“自动化”功能将 ADO 记录集传输到工作表区域
Excel 2000、Excel 2002 和 Excel 2003 的对象模型提供了“CopyFromRecordset”方法,用于向工作表上的区域传输 ADO 记录集。下面的代码说明了如何使用“CopyFromRecordset”方法使 Excel 自动运行,以传输 Northwind 示例数据库中的“订单”表的内容:
 1None.gif// Create a Recordset from all the records in the Orders table.
 2None.gifADODB.Connection objConn = new ADODB.Connection();
 3None.gifADODB._Recordset objRS = null;
 4None.gifobjConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
 5None.gif    m_strNorthwind + ";"""""0);
 6None.gifobjConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
 7None.gifobject objRecAff;
 8None.gifobjRS = (ADODB._Recordset)objConn.Execute("Orders"out objRecAff, 
 9None.gif    (int)ADODB.CommandTypeEnum.adCmdTable);
10None.gif
11None.gif// Start a new workbook in Excel.
12None.gifm_objExcel = new Excel.Application();
13None.gifm_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
14None.gifm_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
15None.gifm_objSheets = (Excel.Sheets)m_objBook.Worksheets;
16None.gifm_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
17None.gif
18None.gif// Get the Fields collection from the recordset and determine
19None.gif// the number of fields (or columns).
20None.gifSystem.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
21None.gifint nFields = objRS.Fields.Count;
22None.gif
23None.gif// Create an array for the headers and add it to the
24None.gif// worksheet starting at cell A1.
25None.gifobject[] objHeaders = new object[nFields];
26None.gifADODB.Field objField = null;
27None.giffor(int n=0;n<nFields;n++)
28ExpandedBlockStart.gifContractedBlock.gifdot.gif{
29InBlock.gif    objFields.MoveNext();
30InBlock.gif    objField = (ADODB.Field)objFields.Current;
31InBlock.gif    objHeaders[n] = objField.Name;
32ExpandedBlockEnd.gif}

33None.gifm_objRange = m_objSheet.get_Range("A1", m_objOpt);
34None.gifm_objRange = m_objRange.get_Resize(1, nFields);
35None.gifm_objRange.Value = objHeaders;
36None.gifm_objFont = m_objRange.Font;
37None.gifm_objFont.Bold=true;
38None.gif
39None.gif// Transfer the recordset to the worksheet starting at cell A2.
40None.gifm_objRange = m_objSheet.get_Range("A2", m_objOpt);
41None.gifm_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
42None.gif
43None.gif// Save the Workbook and quit Excel.
44None.gifm_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
45None.gif    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
46None.gif    m_objOpt, m_objOpt, m_objOpt, m_objOpt);
47None.gifm_objBook.Close(false, m_objOpt, m_objOpt);
48None.gifm_objExcel.Quit();
49None.gif
50None.gif// Close the recordset and connection.
51None.gifobjRS.Close();
52None.gifobjConn.Close();
53None.gif
注意:“CopyFromRecordset”只能与 ADO“Recordset”对象一起使用。使用 ADO.NET 创建的“DataSet”不能与“CopyFromRecordset”方法一起使用。以下几节中的多个示例演示了如何利用 ADO.NET 向 Excel 传输数据。
使用“自动化”功能在工作表上创建 QueryTable 对象
“QueryTable”对象代表了一个表,该表是用从外部数据源返回的数据生成的。当您自动运行 Excel 时,可以通过提供指向 OLE DB 或 ODBC 数据源的连接字符串和 SQL 字符串来创建“QueryTable”。Excel 将生成记录集并将该记录集插入到工作表中您所指定的位置。“QueryTable”对象提供了下列优于“CopyFromRecordset”方法的优点:
Excel 处理记录集的创建并将其放置到工作表中。
您可以利用“QueryTable”对象保存查询,并在以后刷新它以获取更新的记录集。
当向工作表中添加新的“QueryTable”时,可以指定将工作表上的单元格中已经存在的数据移位,以处理新数据(有关更多信息,请查看“RefreshStyle”属性)。
下面的代码演示了如何自动运行 Excel 2000、Excel 2002 或 Excel 2003,以便使用 Northwind 示例数据库中的数据在 Excel 工作表中创建新的“QueryTable”:
 1None.gif// Start a new workbook in Excel.
 2None.gifm_objExcel = new Excel.Application();
 3None.gifm_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
 4None.gifm_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
 5None.gif
 6None.gif// Create a QueryTable that starts at cell A1.
 7None.gifm_objSheets = (Excel.Sheets)m_objBook.Worksheets;
 8None.gifm_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
 9None.gifm_objRange = m_objSheet.get_Range("A1", m_objOpt);
10None.gifm_objQryTables = m_objSheet.QueryTables;
11None.gifm_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
12None.gif    "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
13None.gif    m_strNorthwind + ";", m_objRange, "Select * From Orders");
14None.gifm_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
15None.gifm_objQryTable.Refresh(false);
16None.gif
17None.gif// Save the workbook and quit Excel.
18None.gifm_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
19None.gif    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
20None.gif    m_objOpt, m_objOpt);
21None.gifm_objBook.Close(false, m_objOpt, m_objOpt);
22None.gifm_objExcel.Quit();
23None.gif
使用 Windows 剪贴板
可以使用 Windows 剪贴板来向工作表传输数据。要将数据粘贴到工作表上的多个单元格中,可以复制具有以下格式的字符串:在该字符串中,列由制表符分隔,行由回车符分隔。下面的代码说明了 Visual C# .NET 如何使用 Windows 剪贴板来向 Excel 传输数据:
 1None.gif// Copy a string to the Windows clipboard.
 2None.gifstring sData = "FirstName\tLastName\tBirthdate\r\n"  +
 3None.gif    "Bill\tBrown\t2/5/85\r\n"  +
 4None.gif    "Joe\tThomas\t1/1/91";
 5None.gifSystem.Windows.Forms.Clipboard.SetDataObject(sData);
 6None.gif
 7None.gif// Start a new workbook in Excel.
 8None.gifm_objExcel = new Excel.Application();
 9None.gifm_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
10None.gifm_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
11None.gif
12None.gif// Paste the data starting at cell A1.
13None.gifm_objSheets = (Excel.Sheets)m_objBook.Worksheets;
14None.gifm_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
15None.gifm_objRange = m_objSheet.get_Range("A1", m_objOpt);
16None.gifm_objSheet.Paste(m_objRange, false);
17None.gif
18None.gif// Save the workbook and quit Excel.
19None.gifm_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
20None.gif    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
21None.gif    m_objOpt, m_objOpt);
22None.gifm_objBook.Close(false, m_objOpt, m_objOpt);
23None.gifm_objExcel.Quit();
24None.gif
创建可由 Excel 分析为行和列的带分隔符的文本文件
Excel 可以打开由制表符或逗号分隔的文件并正确地将数据分析为单元格。当您希望向工作表传输大量数据而只使用少量(如果有的话)自动化功能时,可以使用此功能。这对于客户端-服务器程序而言可能是一个好方法,因为文本文件可以在服务器端生成。然后,可以在客户端根据需要使用“自动化”功能来打开文本文件。

下面的代码说明了如何从利用 ADO.NET 读取的数据生成制表符分隔的文本文件:
 1None.gif// Connect to the data source.
 2None.gifSystem.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
 3None.gif    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
 4None.gifobjConn.Open();
 5None.gif
 6None.gif// Execute a command to retrieve all records from the Employees table.
 7None.gifSystem.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
 8None.gif    "Select * From Employees", objConn);
 9None.gifSystem.Data.OleDb.OleDbDataReader objReader;
10None.gifobjReader = objCmd.ExecuteReader();
11None.gif
12None.gif// Create the FileStream and StreamWriter object to write 
13None.gif// the recordset contents to file.
14None.gifSystem.IO.FileStream fs = new System.IO.FileStream(
15None.gif    m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
16None.gifSystem.IO.StreamWriter sw = new System.IO.StreamWriter(
17None.gif    fs, System.Text.Encoding.Unicode);
18None.gif
19None.gif// Write the field names (headers) as the first line in the text file.
20None.gifsw.WriteLine(objReader.GetName(0+  "\t" + objReader.GetName(1+
21None.gif    "\t" + objReader.GetName(2+ "\t" + objReader.GetName(3+
22None.gif    "\t" + objReader.GetName(4+ "\t" + objReader.GetName(5));
23None.gif
24None.gif// Write the first six columns in the recordset to a text file as
25None.gif// tab-delimited.
26None.gifwhile(objReader.Read()) 
27ExpandedBlockStart.gifContractedBlock.gifdot.gif{
28InBlock.gif    for(int i=0;i<=5;i++)
29ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
30InBlock.gif        if(!objReader.IsDBNull(i))
31ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
32InBlock.gif            string s;
33InBlock.gif            s = objReader.GetDataTypeName(i);
34InBlock.gif            if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
35ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
36InBlock.gif                sw.Write(objReader.GetInt32(i).ToString());
37ExpandedSubBlockEnd.gif            }

38InBlock.gif            else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
39ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
40InBlock.gif                sw.Write(objReader.GetDateTime(i).ToString("d"));
41ExpandedSubBlockEnd.gif            }

42InBlock.gif            else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
43ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
44InBlock.gif                sw.Write(objReader.GetString(i));
45ExpandedSubBlockEnd.gif            }

46ExpandedSubBlockEnd.gif        }

47InBlock.gif        if(i<5) sw.Write("\t");
48ExpandedSubBlockEnd.gif    }

49InBlock.gif    sw.WriteLine(); 
50ExpandedBlockEnd.gif}

51None.gifsw.Flush();    // Write the buffered data to the filestream.
52None.gif
53None.gif// Close the FileStream.
54None.giffs.Close();
55None.gif
56None.gif// Close the reader and the connection.
57None.gifobjReader.Close();
58None.gifobjConn.Close(); 
59None.gif
上述代码没有使用“自动化”功能。不过,如果您愿意,您可以按如下方式使用“自动化”功能来打开文本文件,并以 Excel 工作簿格式保存该文件:
 1None.gif// Open the text file in Excel.
 2None.gifm_objExcel = new Excel.Application();
 3None.gifm_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
 4None.gifm_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1
 5None.gif    Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
 6None.gif    falsetruefalsefalsefalsefalse, m_objOpt, m_objOpt, 
 7None.gif    m_objOpt, m_objOpt, m_objOpt);
 8None.gif
 9None.gifm_objBook = m_objExcel.ActiveWorkbook;
10None.gif
11None.gif// Save the text file in the typical workbook format and quit Excel.
12None.gifm_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
13None.gif    m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
14None.gif    m_objOpt, m_objOpt);
15None.gifm_objBook.Close(false, m_objOpt, m_objOpt);
16None.gifm_objExcel.Quit();
17None.gif            
使用 ADO.NET 将数据传输到工作表
您可以使用 Microsoft Jet OLE DB 提供程序向现有的 Excel 工作簿中的表中添加记录。Excel 中的 只是由单元格组成的区域;该区域可能具有定义的名称。通常,区域的第一行包含标题(或字段名),该区域中所有以后的行都包含记录。

下面的代码向 Book7.xls 中的表中添加了两个新记录。在此示例中,该表是 Sheet1:
 1None.gif// Establish a connection to the data source.
 2None.gifSystem.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
 3None.gif    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
 4None.gif    "Book7.xls;Extended Properties=Excel 8.0;");
 5None.gifobjConn.Open();
 6None.gif
 7None.gif// Add two records to the table named 'MyTable'.
 8None.gifSystem.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
 9None.gifobjCmd.Connection = objConn;
10None.gifobjCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
11None.gif    " values ('Bill', 'Brown')";
12None.gifobjCmd.ExecuteNonQuery();
13None.gifobjCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
14None.gif    " values ('Joe', 'Thomas')";
15None.gifobjCmd.ExecuteNonQuery();
16None.gif
17None.gif// Close the connection.
18None.gifobjConn.Close();
19None.gif            
当您按本示例所示的方法利用 ADO.NET 添加记录时,工作簿中的格式将被保持。添加到行中的每个记录都将继承它前面的行的格式。
传输 XML 数据(Excel 2002 和 Excel 2003)
Excel 2002 和 2003 可以打开格式完好的任何 XML 文件。您可以使用“文件”菜单上的“打开”命令直接打开 XML 文件,也可以使用“Workbooks”集合的“Open”或“OpenXML”方法以编程方式打开 XML 文件。如果您创建供在 Excel 中使用的 XML 文件,您还可以创建样式表来设置数据的格式。

创建完整的示例 Visual C# .NET 项目

1.创建一个名为 C:\ExcelData 的新文件夹。示例程序将在此文件夹中存储 Excel 工作簿。
2.创建一个新工作簿,以供示例向其中写入数据:
a. 在 Excel 中启动一个新工作簿。
b. 在新工作簿的 Sheet1 上,在单元格 A1 中键入 FirstName,在单元格 B1 中键入 LastName
c. 选择 A1:B1。
d. 在“插入”菜单上,指向“名称”,然后单击“定义”。键入名称 MyTable,然后单击“确定”。
e. 将该工作簿另存为 C:\Exceldata\Book7.xls
f. 退出 Excel。
3.启动 Microsoft Visual Studio 2005 或 Microsoft Visual Studio .NET。在“文件”菜单上,指向“新建”,
然后单击“项目”。在“Visual C# 项目”或“Visual C#”下,选择“Windows 应用程序”。
默认情况下会创建 Form1。
4.添加对 Excel 对象库和 ADODB 主互操作程序集的引用。为此,请按照下列步骤操作:
a. 在“项目”菜单上,单击“添加引用”。
b. 在“NET”选项卡上,找到“ADODB”,然后单击“选择”。

注意:在 Visual Studio 2005 中,您不需要单击“选择”。
c. 在“COM”选项卡上,找到“Microsoft Excel 10.0 对象库或 Microsoft Excel 11.0 对象库”,
然后单击“选择”。

注意:在 Visual Studio 2005 中,您不需要单击“选择”。

注意:如果您正在使用 Microsoft Excel 2002,并且尚未这样做,
Microsoft 建议您下载并安装 Microsoft Office XP 主互操作 程序集 (PIA)。
d. 在“添加引用”对话框中,单击“确定”以接受您的选择。
5.向 Form1 中添加一个“Combo Box”控件和一个“Button”控件。
6.为该窗体的“Load”事件和 Button 控件的“Click”事件添加事件处理程序:
a. 在 Form1.cs 的设计视图中,双击“Form1”。

此时将创建该窗体的“Load”事件的处理程序,该处理程序出现在 Form1.cs 中。
b. 在“视图”菜单上,单击“设计器”以切换到设计视图。
c. 双击“Button1”。

此时将创建该按钮的“Click”事件的处理程序,该处理程序出现在 Form1.cs 中。
在 Form1.cs 中,将以下代码:
 1None.gifprivate void Form1_Load(object sender, System.EventArgs e)
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 3InBlock.gif
 4ExpandedBlockEnd.gif}

 5None.gif
 6None.gifprivate void button1_Click(object sender, System.EventArgs e)
 7ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 8InBlock.gif
 9ExpandedBlockEnd.gif}

10None.gif
替换为:
        
  1None.gif// Excel object references.
  2None.gif        private Excel.Application m_objExcel =  null;
  3None.gif        private Excel.Workbooks m_objBooks = null;
  4None.gif        private Excel._Workbook m_objBook = null;
  5None.gif        private Excel.Sheets m_objSheets = null;
  6None.gif        private Excel._Worksheet m_objSheet = null;
  7None.gif        private Excel.Range m_objRange =  null;
  8None.gif        private Excel.Font m_objFont = null;
  9None.gif        private Excel.QueryTables m_objQryTables = null;
 10None.gif        private Excel._QueryTable m_objQryTable = null;
 11None.gif
 12None.gif        // Frequenty-used variable for optional arguments.
 13None.gif        private object m_objOpt = System.Reflection.Missing.Value;
 14None.gif
 15None.gif        // Paths used by the sample code for accessing and storing data.
 16None.gif        private object m_strSampleFolder = 
              "C:\\ExcelData\\";
 17None.gif        private string m_strNorthwind = 
              "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb";
 18None.gif
 19None.gif        private void Form1_Load(object sender, System.EventArgs e)
 20ExpandedBlockStart.gifContractedBlock.gif        dot.gif{            
 21InBlock.gif            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
 22InBlock.gif
 23ExpandedSubBlockStart.gifContractedSubBlock.gif            comboBox1.Items.AddRange(new object[]dot.gif{
 24InBlock.gif               "Use Automation to Transfer Data Cell by Cell "
 25InBlock.gif               "Use Automation to Transfer an Array of Data to a Range on a Worksheet "
 26InBlock.gif               "Use Automation to Transfer an ADO Recordset to a Worksheet Range "
 27InBlock.gif               "Use Automation to Create a QueryTable on a Worksheet"
 28InBlock.gif               "Use the Clipboard"
 29InBlock.gif               "Create a Delimited Text File that Excel Can Parse into Rows and Columns"
 30ExpandedSubBlockEnd.gif               "Transfer Data to a Worksheet Using ADO.NET "}
);
 31InBlock.gif            comboBox1.SelectedIndex = 0;
 32InBlock.gif            button1.Text = "Go!";
 33ExpandedBlockEnd.gif        }

 34None.gif
 35None.gif        private void button1_Click(object sender, System.EventArgs e)
 36ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
 37InBlock.gif            switch (comboBox1.SelectedIndex)
 38ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 39InBlock.gif                case 0 : Automation_CellByCell(); break;
 40InBlock.gif                case 1 : Automation_UseArray(); break;
 41InBlock.gif                case 2 : Automation_ADORecordset(); break;
 42InBlock.gif                case 3 : Automation_QueryTable(); break;
 43InBlock.gif                case 4 : Use_Clipboard(); break;
 44InBlock.gif                case 5 : Create_TextFile(); break;
 45InBlock.gif                case 6 : Use_ADONET(); break;
 46ExpandedSubBlockEnd.gif            }

 47InBlock.gif    
 48InBlock.gif            //Clean-up
 49InBlock.gif            m_objFont = null;
 50InBlock.gif            m_objRange = null;
 51InBlock.gif            m_objSheet = null;
 52InBlock.gif            m_objSheets = null;
 53InBlock.gif            m_objBooks = null;
 54InBlock.gif            m_objBook = null;
 55InBlock.gif            m_objExcel = null;
 56InBlock.gif            GC.Collect();
 57InBlock.gif
 58ExpandedBlockEnd.gif        }

 59None.gif
 60None.gif        private void Automation_CellByCell()
 61ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
 62InBlock.gif            // Start a new workbook in Excel.
 63InBlock.gif            m_objExcel = new Excel.Application();
 64InBlock.gif            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
 65InBlock.gif            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
 66InBlock.gif
 67InBlock.gif            // Add data to cells of the first worksheet in the new workbook.
 68InBlock.gif            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
 69InBlock.gif            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
 70InBlock.gif            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
 71InBlock.gif            m_objRange.set_Value(m_objOpt,"Last Name");
 72InBlock.gif            m_objRange = m_objSheet.get_Range("B1", m_objOpt);
 73InBlock.gif            m_objRange.set_Value(m_objOpt,"First Name");
 74InBlock.gif            m_objRange = m_objSheet.get_Range("A2", m_objOpt);
 75InBlock.gif            m_objRange.set_Value(m_objOpt,"Doe");
 76InBlock.gif            m_objRange = m_objSheet.get_Range("B2", m_objOpt);
 77InBlock.gif            m_objRange.set_Value(m_objOpt,"John");
 78InBlock.gif
 79InBlock.gif            // Apply bold to cells A1:B1.
 80InBlock.gif            m_objRange = m_objSheet.get_Range("A1""B1");
 81InBlock.gif            m_objFont = m_objRange.Font;
 82InBlock.gif            m_objFont.Bold=true;
 83InBlock.gif
 84InBlock.gif            // Save the workbook and quit Excel.
 85InBlock.gif            m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
 86InBlock.gif                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
 87InBlock.gif                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
 88InBlock.gif            m_objBook.Close(false, m_objOpt, m_objOpt);
 89InBlock.gif            m_objExcel.Quit();
 90InBlock.gif
 91ExpandedBlockEnd.gif        }

 92None.gif
 93None.gif        private void Automation_UseArray()
 94ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
 95InBlock.gif            // Start a new workbook in Excel.
 96InBlock.gif            m_objExcel = new Excel.Application();
 97InBlock.gif            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
 98InBlock.gif            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
 99InBlock.gif            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
100InBlock.gif            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
101InBlock.gif
102InBlock.gif            // Create an array for the headers and add it to cells A1:C1.
103ExpandedSubBlockStart.gifContractedSubBlock.gif            object[] objHeaders = dot.gif{"Order ID""Amount""Tax"};
104InBlock.gif            m_objRange = m_objSheet.get_Range("A1""C1");
105InBlock.gif            m_objRange.set_Value(m_objOpt,objHeaders);
106InBlock.gif            m_objFont = m_objRange.Font;
107InBlock.gif            m_objFont.Bold=true;
108InBlock.gif
109InBlock.gif            // Create an array with 3 columns and 100 rows and add it to
110InBlock.gif            // the worksheet starting at cell A2.
111InBlock.gif            object[,] objData = new Object[100,3];
112InBlock.gif            Random rdm = new Random((int)DateTime.Now.Ticks);
113InBlock.gif            double nOrderAmt, nTax;
114InBlock.gif            for(int r=0;r<100;r++)
115ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
116InBlock.gif                objData[r,0= "ORD" + r.ToString("0000");
117InBlock.gif                nOrderAmt = rdm.Next(1000);
118InBlock.gif                objData[r,1= nOrderAmt.ToString("c");
119InBlock.gif                nTax = nOrderAmt*0.07;
120InBlock.gif                objData[r,2= nTax.ToString("c");
121ExpandedSubBlockEnd.gif            }

122InBlock.gif            m_objRange = m_objSheet.get_Range("A2", m_objOpt);
123InBlock.gif            m_objRange = m_objRange.get_Resize(100,3);
124InBlock.gif            m_objRange.set_Value(m_objOpt,"objData");
125InBlock.gif            
126InBlock.gif            // Save the workbook and quit Excel.
127InBlock.gif            m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
128InBlock.gif                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
129InBlock.gif                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
130InBlock.gif            m_objBook.Close(false, m_objOpt, m_objOpt);
131InBlock.gif            m_objExcel.Quit();
132InBlock.gif
133ExpandedBlockEnd.gif        }

134None.gif
135None.gif        private void Automation_ADORecordset()
136ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
137InBlock.gif            // Create a Recordset from all the records in the Orders table.
138InBlock.gif            ADODB.Connection objConn = new ADODB.Connection();
139InBlock.gif            ADODB._Recordset objRS = null;
140InBlock.gif            objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
141InBlock.gif                m_strNorthwind + ";"""""0);
142InBlock.gif            objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
143InBlock.gif            object objRecAff;
144InBlock.gif            objRS = (ADODB._Recordset)objConn.Execute("Orders"out objRecAff, 
145InBlock.gif                (int)ADODB.CommandTypeEnum.adCmdTable);
146InBlock.gif
147InBlock.gif            // Start a new workbook in Excel.
148InBlock.gif            m_objExcel = new Excel.Application();
149InBlock.gif            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
150InBlock.gif            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
151InBlock.gif            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
152InBlock.gif            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
153InBlock.gif
154InBlock.gif            // Get the Fields collection from the recordset and determine
155InBlock.gif            // the number of fields (or columns).
156InBlock.gif            System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
157InBlock.gif            int nFields = objRS.Fields.Count;
158InBlock.gif
159InBlock.gif            // Create an array for the headers and add it to the
160InBlock.gif            // worksheet starting at cell A1.
161InBlock.gif            object[] objHeaders = new object[nFields];
162InBlock.gif            ADODB.Field objField = null;
163InBlock.gif            for(int n=0;n<nFields;n++)
164ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
165InBlock.gif                objFields.MoveNext();
166InBlock.gif                objField = (ADODB.Field)objFields.Current;
167InBlock.gif                objHeaders[n] = objField.Name;
168ExpandedSubBlockEnd.gif            }

169InBlock.gif            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
170InBlock.gif            m_objRange = m_objRange.get_Resize(1, nFields);
171InBlock.gif            m_objRange.set_Value(m_objOpt,objHeaders);
172InBlock.gif            m_objFont = m_objRange.Font;
173InBlock.gif            m_objFont.Bold=true;
174InBlock.gif
175InBlock.gif            // Transfer the recordset to the worksheet starting at cell A2.
176InBlock.gif            m_objRange = m_objSheet.get_Range("A2", m_objOpt);
177InBlock.gif            m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
178InBlock.gif
179InBlock.gif            // Save the workbook and quit Excel.
180InBlock.gif            m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
181InBlock.gif                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
182InBlock.gif                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
183InBlock.gif            m_objBook.Close(false, m_objOpt, m_objOpt);
184InBlock.gif            m_objExcel.Quit();
185InBlock.gif
186InBlock.gif            //Close the recordset and connection
187InBlock.gif            objRS.Close();
188InBlock.gif            objConn.Close();
189InBlock.gif
190ExpandedBlockEnd.gif        }

191None.gif
192None.gif        private void Automation_QueryTable()
193ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
194InBlock.gif            // Start a new workbook in Excel.
195InBlock.gif            m_objExcel = new Excel.Application();
196InBlock.gif            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
197InBlock.gif            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
198InBlock.gif
199InBlock.gif            // Create a QueryTable that starts at cell A1.
200InBlock.gif            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
201InBlock.gif            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
202InBlock.gif            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
203InBlock.gif            m_objQryTables = m_objSheet.QueryTables;
204InBlock.gif            m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
205InBlock.gif                "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
206InBlock.gif                m_strNorthwind + ";", m_objRange, "Select * From Orders");
207InBlock.gif            m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
208InBlock.gif            m_objQryTable.Refresh(false);
209InBlock.gif
210InBlock.gif            // Save the workbook and quit Excel.
211InBlock.gif            m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
212InBlock.gif                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
213InBlock.gif                m_objOpt, m_objOpt, m_objOpt);
214InBlock.gif            m_objBook.Close(false, m_objOpt, m_objOpt);
215InBlock.gif            m_objExcel.Quit();
216InBlock.gif
217ExpandedBlockEnd.gif        }

218None.gif
219None.gif        private void Use_Clipboard()
220ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
221InBlock.gif            // Copy a string to the clipboard.
222InBlock.gif            string sData = "FirstName\tLastName\tBirthdate\r\n"  +
223InBlock.gif                "Bill\tBrown\t2/5/85\r\n"  +
224InBlock.gif                "Joe\tThomas\t1/1/91";
225InBlock.gif            System.Windows.Forms.Clipboard.SetDataObject(sData);
226InBlock.gif
227InBlock.gif            // Start a new workbook in Excel.
228InBlock.gif            m_objExcel = new Excel.Application();
229InBlock.gif            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
230InBlock.gif            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
231InBlock.gif
232InBlock.gif            // Paste the data starting at cell A1.
233InBlock.gif            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
234InBlock.gif            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
235InBlock.gif            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
236InBlock.gif            m_objSheet.Paste(m_objRange, false);
237InBlock.gif
238InBlock.gif            // Save the workbook and quit Excel.
239InBlock.gif            m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
240InBlock.gif                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
241InBlock.gif                m_objOpt, m_objOpt, m_objOpt);
242InBlock.gif            m_objBook.Close(false, m_objOpt, m_objOpt);
243InBlock.gif            m_objExcel.Quit();
244InBlock.gif
245ExpandedBlockEnd.gif        }

246None.gif
247None.gif        private void Create_TextFile()
248ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
249InBlock.gif            // Connect to the data source.
250InBlock.gif            System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
251InBlock.gif                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
252InBlock.gif            objConn.Open();
253InBlock.gif
254InBlock.gif            // Execute a command to retrieve all records from the Employees  table.
255InBlock.gif            System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
256InBlock.gif                "Select * From Employees", objConn);
257InBlock.gif            System.Data.OleDb.OleDbDataReader objReader;
258InBlock.gif            objReader = objCmd.ExecuteReader();
259InBlock.gif
260InBlock.gif
261InBlock.gif            // Create the FileStream and StreamWriter object to write 
262InBlock.gif            // the recordset contents to file.
263InBlock.gif            System.IO.FileStream fs = new System.IO.FileStream(
264InBlock.gif                m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
265InBlock.gif            System.IO.StreamWriter sw = new System.IO.StreamWriter(
266InBlock.gif                fs, System.Text.Encoding.Unicode);
267InBlock.gif
268InBlock.gif            // Write the field names (headers) as the first line in the text file.
269InBlock.gif            sw.WriteLine(objReader.GetName(0+  "\t" + objReader.GetName(1+
270InBlock.gif                "\t" + objReader.GetName(2+ "\t" + objReader.GetName(3+
271InBlock.gif                "\t" + objReader.GetName(4+ "\t" + objReader.GetName(5));
272InBlock.gif
273InBlock.gif            // Write the first six columns in the recordset to a text file as
274InBlock.gif            // tab-delimited.
275InBlock.gif            while(objReader.Read()) 
276ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
277InBlock.gif                for(int i=0;i<=5;i++)
278ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
279InBlock.gif                    if(!objReader.IsDBNull(i))
280ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
281InBlock.gif                        string s;
282InBlock.gif                        s = objReader.GetDataTypeName(i);
283InBlock.gif                        if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
284ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
285InBlock.gif                            sw.Write(objReader.GetInt32(i).ToString());
286ExpandedSubBlockEnd.gif                        }

287InBlock.gif                        else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
288ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
289InBlock.gif                            sw.Write(objReader.GetDateTime(i).ToString("d"));
290ExpandedSubBlockEnd.gif                        }

291InBlock.gif                        else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
292ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
293InBlock.gif                            sw.Write(objReader.GetString(i));
294ExpandedSubBlockEnd.gif                        }

295ExpandedSubBlockEnd.gif                    }

296InBlock.gif                    if(i<5) sw.Write("\t");
297ExpandedSubBlockEnd.gif                }

298InBlock.gif                sw.WriteLine(); 
299ExpandedSubBlockEnd.gif            }

300InBlock.gif            sw.Flush();    // Write the buffered data to the FileStream.
301InBlock.gif
302InBlock.gif            // Close the FileStream.
303InBlock.gif            fs.Close();
304InBlock.gif
305InBlock.gif            // Close the reader and the connection.
306InBlock.gif            objReader.Close();
307InBlock.gif            objConn.Close(); 
308InBlock.gif
309InBlock.gif            // ==================================================================
310InBlock.gif            // Optionally, automate Excel to open the text file and save it in the
311InBlock.gif            // Excel workbook format.
312InBlock.gif
313InBlock.gif            // Open the text file in Excel.
314InBlock.gif            m_objExcel = new Excel.Application();
315InBlock.gif            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
316InBlock.gif            m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1
317InBlock.gif                Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
318InBlock.gif                falsetruefalsefalsefalsefalse, m_objOpt, m_objOpt, 
319InBlock.gif                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
320InBlock.gif
321InBlock.gif            m_objBook = m_objExcel.ActiveWorkbook;
322InBlock.gif
323InBlock.gif            // Save the text file in the typical workbook format and quit Excel.
324InBlock.gif            m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
325InBlock.gif                m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
326InBlock.gif                m_objOpt, m_objOpt, m_objOpt);
327InBlock.gif            m_objBook.Close(false, m_objOpt, m_objOpt);
328InBlock.gif            m_objExcel.Quit();
329InBlock.gif
330ExpandedBlockEnd.gif        }

331None.gif
332None.gif        private void Use_ADONET()
333ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
334InBlock.gif            // Establish a connection to the data source.
335InBlock.gif            System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
336InBlock.gif                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
337InBlock.gif                "Book7.xls;Extended Properties=Excel 8.0;");
338InBlock.gif            objConn.Open();
339InBlock.gif
340InBlock.gif            // Add two records to the table named 'MyTable'.
341InBlock.gif            System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
342InBlock.gif            objCmd.Connection = objConn;
343InBlock.gif            objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
344InBlock.gif                " values ('Bill', 'Brown')";
345InBlock.gif    
346InBlock.gif            objCmd.ExecuteNonQuery();
347InBlock.gif            objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
348InBlock.gif                " values ('Joe', 'Thomas')";
349InBlock.gif            objCmd.ExecuteNonQuery();
350InBlock.gif
351InBlock.gif
352InBlock.gif            // Close the connection.
353InBlock.gif            objConn.Close(); 
354InBlock.gif
355ExpandedBlockEnd.gif        }
 
356None.gif
357None.gif    }  // End Class
358None.gif}// End namespace
359None.gif
注意:您必须更改 Visual Studio 2005 中的代码。默认情况下,当创建一个 Windows 窗体项目时,
Visual C# 会向该项目中添加一个窗体。该窗体被命名为 Form1。
代表该窗体的两个文件被命名为 Form1.cs 和 Form1.designer.cs。您在 Form1.cs 中编写代码。
Form1.designer.cs 文件是 Windows 窗体设计器编写代码的地方,
\这些代码可以实现通过拖放工具箱中的控件而执行的所有操作。
 
注意:如果您没有将 Office 安装到默认文件夹 (C:\Program Files\Microsoft Office) 中,
请修改代码示例中的“m_strNorthwind”常量以匹配 Northwind.mdb 的安装路径。
8.将下面的代码添加到 Form1.cs 中的“Using”指令中:
1None.gif    using System.Reflection;
2None.gif    using System.Runtime.InteropServices;
3None.gif    using Excel = Microsoft.Office.Interop.Excel;
4None.gif
9.按 F5 生成并运行该示例。

转自: http://support.microsoft.com/kb/306023/zh-cn

转载于:https://www.cnblogs.com/eric-huang/archive/2008/05/06/1184584.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值