向EXCEL批量导出数据(转)
自(http://www.cnblogs.com/Wiseman/archive/2004/11/26/69113.html)
HOW TO:使用 Visual C# .NET 向 Excel 工作簿传输数据本任务的内容
概要
概述
利用“自动化”,您可以使用多种技术来传输数据:
| • | 逐个单元格地传输数据 | 
| • | 将数组中的数据传输到由单元格组成的区域。 | 
| • | 使用 CopyFromRecordset 方法向单元格区域传输 ADO 记录集中的数据。 | 
| • | 在 Excel 工作表上创建一个 QueryTable 对象,该对象包含对 ODBC 或 OLEDB 数据源进行查询的结果。 | 
| • | 将数据传输到剪贴板,然后将剪贴板内容粘贴到 Excel 工作表中。 | 
要在不使用“自动化”的情况下传输数据,您可以使用下列方法:
| • | 将数据传输到制表符分隔的或逗号分隔的文本文件,然后 Excel 可以将该文本文件分析为工作表上的单元格。 | 
| • | 使用 ADO.NET 将数据传输到工作表。 | 
| • | 将 XML 数据传输到 Excel(仅限于 2002 和 2003 版)以提供可以被格式化和排列为行和列的数据。 | 
返回页首
方法
使用“自动化”逐个单元格地传输数据
// 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();
                        
有关其他信息以及如何利用 Visual C# .NET 自动运行 Excel 的示例,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
使用“自动化”将数据数组传输到工作表上的区域
// 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();
                        
objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;
                        
有关通过 Excel 自动化并使用数组获取和设置区域中的值的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
使用“自动化”将 ADO 记录集传输到工作表区域
// 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();
                        
返回页首
使用“自动化”在工作表上创建 QueryTable 对象
| • | Excel 处理记录集的创建并将其放置到工作表中。 | 
| • | 您可以利用 QueryTable 对象保存查询,并在以后刷新它以获取更新的记录集。 | 
| • | 当向工作表中添加新的 QueryTable 时,可以指定将工作表上的单元格中已经存在的数据移位,以处理新数据(有关详细信息,请查看 RefreshStyle 属性)。 | 
// 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 剪贴板
// 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);
//这是我加的,否则真正在处理大量数据时,objSheet.Paste会引发异常HRESULT:0x800A03EC,原因是上面的Clipboard.SetDataObject的工作还没完成
int wait =50+ data.Length / 1000;
Thread.Sleep(wait);
m_objSheet.Paste(m_objRange, false); // Save the workbook and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt);m_objExcel.Quit(); 返回页首
创建可由 Excel 分析为行和列的带分隔符的文本文件
Excel 可以打开由制表符或逗号分隔的文件并正确地将数据分析为单元格。当您希望向工作表传输大量数据而只使用少量(如果有的话)自动化功能时,可以使用此功能。这对于客户端-服务器程序而言可能是一个好方法,因为文本文件可以在服务器端生成。然后,可以在客户端根据需要使用“自动化”来打开文本文件。
下面的代码说明了如何从利用 ADO.NET 读取的数据生成制表符分隔的文本文件:
// Connect to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
      "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
objConn.Open();
// Execute a command to retrieve all records from the Employees table.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand(
      "Select * From Employees", objConn);
System.Data.OleDb.OleDbDataReader objReader;
objReader = objCmd.ExecuteReader();
// Create the FileStream and StreamWriter object to write
// the recordset contents to file.
System.IO.FileStream fs = new System.IO.FileStream(
      m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
System.IO.StreamWriter sw = new System.IO.StreamWriter(
      fs, System.Text.Encoding.Unicode);
// Write the field names (headers) as the first line in the text file.
sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
      "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
      "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));
// Write the first six columns in the recordset to a text file as
// tab-delimited.
while(objReader.Read())
{
      for(int i=0;i<=5;i++)
      {
            if(!objReader.IsDBNull(i))
            {
                  string s;
                  s = objReader.GetDataTypeName(i);
                  if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
                  {
                        sw.Write(objReader.GetInt32(i).ToString());
                  }
                  else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
                  {
                        sw.Write(objReader.GetDateTime(i).ToString("d"));
                  }
                  else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
                  {
                        sw.Write(objReader.GetString(i));
                  }
            }
            if(i<5) sw.Write("\t");
      }
      sw.WriteLine();
}
sw.Flush();      // Write the buffered data to the filestream.
// Close the FileStream.
fs.Close();
// Close the reader and the connection.
objReader.Close();
objConn.Close();
                        
上述代码没有使用自动化。然而,如果您愿意,您可以按如下方式使用“自动化”来打开文本文件,并以 Excel 工作簿格式保存该文件:
// Open the text file in Excel. m_objExcel = new Excel.Application(); m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks; m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, false, true, false, false, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook = m_objExcel.ActiveWorkbook; // Save the text file in the typical workbook format and quit Excel. m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt); m_objBook.Close(false, m_objOpt, m_objOpt); m_objExcel.Quit();
使用 ADO.NET 将数据传输到工作表
您可以使用 Microsoft Jet OLE DB 提供程序向现有 Excel 工作簿中的表中添加记录。Excel 中的表 只是由单元格组成的区域;该区域可能具有规定的名称。通常,区域的第一行包含标题(或字段名),该区域中所有以后的行都包含记录。
下面的代码向 Book7.xls 中的表添加了两个新记录。在此情况下,该表是 Sheet1:
// Establish a connection to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
      "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
      "Book7.xls;Extended Properties=Excel 8.0;");
objConn.Open();
// Add two records to the table named 'MyTable'.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
objCmd.Connection = objConn;
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
      " values ('Bill', 'Brown')";
objCmd.ExecuteNonQuery();
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
      " values ('Joe', 'Thomas')";
objCmd.ExecuteNonQuery();
// Close the connection.
objConn.Close();
                        
当您按本例所示的方法利用 ADO.NET 添加记录时,工作簿中的格式将被保持。添加到行中的每个记录都将继承它前面的行的格式。
有关使用 ADO.NET 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
有关如何将 Jet OLEDB 提供程序与 Excel 数据源一起使用的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章。
传输 XML 数据(Excel 2002 和 Excel 2003)
Excel 2002 和 2003 可以打开格式完好的任何 XML 文件。您可以使用文件菜单上的打开命令直接打开 XML 文件,也可以使用 Workbooks 集合的 Open 或 OpenXML 方法以编程方式打开 XML 文件。如果您创建供在 Excel 中使用的 XML 文件,您还可以创建样式表来设置数据的格式。
有关如何将 XML 与 Excel 2002 一起使用的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
创建完整的示例 Visual C# .NET 项目
| 1. | 创建一个名为 C:\ExcelData 的新文件夹。示例程序将在此文件夹中存储 Excel 工作簿。 | ||||||||||||
| 2. | 创建一个新工作簿,以供示例向其中写入数据: 
 | ||||||||||||
| 3. | 启动 Visual Studio .NET。在文件菜单上,指向新建,然后单击项目。在 Visual C# 项目下,选择 Windows 应用程序。默认情况下会创建 Form1。 | ||||||||||||
| 4. | 添加对 Excel 对象库和 ADODB 主 interop 程序集的引用。为此,请按照下列步骤操作: 
 | ||||||||||||
| 5. | 向 Form1 添加一个 Combo Box 控件和一个 Button 控件。 | ||||||||||||
| 6. | 为该窗体的 Load 事件和 Button 控件的 Click事件添加事件处理程序: 
 | ||||||||||||
| 7. | 在 Form1.cs 中,将以下代码: private void Form1_Load(object sender, System.EventArgs e)
{
}
private void button1_Click(object sender, System.EventArgs e)
{
}
                              替换为:        // Excel object references.
        private Excel.Application m_objExcel =  null;
        private Excel.Workbooks m_objBooks = null;
        private Excel._Workbook m_objBook = null;
        private Excel.Sheets m_objSheets = null;
        private Excel._Worksheet m_objSheet = null;
        private Excel.Range m_objRange =  null;
        private Excel.Font m_objFont = null;
        private Excel.QueryTables m_objQryTables = null;
        private Excel._QueryTable m_objQryTable = null;
        // Frequenty-used variable for optional arguments.
        private object m_objOpt = System.Reflection.Missing.Value;
        // Paths used by the sample code for accessing and storing data.
        private object m_strSampleFolder = "C:\\ExcelData\\";
        private string m_strNorthwind = "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb";
        private void Form1_Load(object sender, System.EventArgs e)
        {
            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
            comboBox1.Items.AddRange(new object[]{
                                                     "Use Automation to Transfer Data Cell by Cell ",
                                                     "Use Automation to Transfer an Array of Data to a Range on a Worksheet ",
                                                     "Use Automation to Transfer an ADO Recordset to a Worksheet Range ",
                                                     "Use Automation to Create a QueryTable on a Worksheet",
                                                     "Use the Clipboard",
                                                     "Create a Delimited Text File that Excel Can Parse into Rows and Columns",
                                                     "Transfer Data to a Worksheet Using ADO.NET "});
            comboBox1.SelectedIndex = 0;
            button1.Text = "Go!";
        }
        private void button1_Click(object sender, System.EventArgs e)
        {
            switch (comboBox1.SelectedIndex)
            {
                case 0 : Automation_CellByCell(); break;
                case 1 : Automation_UseArray(); break;
                case 2 : Automation_ADORecordset(); break;
                case 3 : Automation_QueryTable(); break;
                case 4 : Use_Clipboard(); break;
                case 5 : Create_TextFile(); break;
                case 6 : Use_ADONET(); break;
            }
            //Clean-up
            m_objFont = null;
            m_objRange = null;
            m_objSheet = null;
            m_objSheets = null;
            m_objBooks = null;
            m_objBook = null;
            m_objExcel = null;
            GC.Collect();
        }
        private void Automation_CellByCell()
        {
            // Start a new workbook in Excel.
            m_objExcel = new Excel.Application();
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
            // Add data to cells of the first worksheet in the new workbook.
            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
            m_objRange.set_Value(m_objOpt,"Last Name");
            m_objRange = m_objSheet.get_Range("B1", m_objOpt);
            m_objRange.set_Value(m_objOpt,"First Name");
            m_objRange = m_objSheet.get_Range("A2", m_objOpt);
            m_objRange.set_Value(m_objOpt,"Doe");
            m_objRange = m_objSheet.get_Range("B2", m_objOpt);
            m_objRange.set_Value(m_objOpt,"John");
            // Apply bold to cells A1:B1.
            m_objRange = m_objSheet.get_Range("A1", "B1");
            m_objFont = m_objRange.Font;
            m_objFont.Bold=true;
            // Save the workbook and quit Excel.
            m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
            m_objBook.Close(false, m_objOpt, m_objOpt);
            m_objExcel.Quit();
        }
        private void Automation_UseArray()
        {
            // Start a new workbook in Excel.
            m_objExcel = new Excel.Application();
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
            // Create an array for the headers and add it to cells A1:C1.
            object[] objHeaders = {"Order ID", "Amount", "Tax"};
            m_objRange = m_objSheet.get_Range("A1", "C1");
            m_objRange.set_Value(m_objOpt,objHeaders);
            m_objFont = m_objRange.Font;
            m_objFont.Bold=true;
            // Create an array with 3 columns and 100 rows and add it to
            // the worksheet starting at cell A2.
            object[,] objData = new Object[100,3];
            Random rdm = new Random((int)DateTime.Now.Ticks);
            double nOrderAmt, nTax;
            for(int r=0;r<100;r++)
            {
                objData[r,0] = "ORD" + r.ToString("0000");
                nOrderAmt = rdm.Next(1000);
                objData[r,1] = nOrderAmt.ToString("c");
                nTax = nOrderAmt*0.07;
                objData[r,2] = nTax.ToString("c");
            }
            m_objRange = m_objSheet.get_Range("A2", m_objOpt);
            m_objRange = m_objRange.get_Resize(100,3);
            m_objRange.set_Value(m_objOpt,"objData");
            // Save the workbook and quit Excel.
            m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
            m_objBook.Close(false, m_objOpt, m_objOpt);
            m_objExcel.Quit();
        }
        private void Automation_ADORecordset()
        {
            // Create a Recordset from all the records in the Orders table.
            ADODB.Connection objConn = new ADODB.Connection();
            ADODB._Recordset objRS = null;
            objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                m_strNorthwind + ";", "", "", 0);
            objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
            object objRecAff;
            objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff,
                (int)ADODB.CommandTypeEnum.adCmdTable);
            // Start a new workbook in Excel.
            m_objExcel = new Excel.Application();
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
            // Get the Fields collection from the recordset and determine
            // the number of fields (or columns).
            System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
            int nFields = objRS.Fields.Count;
            // Create an array for the headers and add it to the
            // worksheet starting at cell A1.
            object[] objHeaders = new object[nFields];
            ADODB.Field objField = null;
            for(int n=0;n<nFields;n++)
            {
                objFields.MoveNext();
                objField = (ADODB.Field)objFields.Current;
                objHeaders[n] = objField.Name;
            }
            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
            m_objRange = m_objRange.get_Resize(1, nFields);
            m_objRange.set_Value(m_objOpt,objHeaders);
            m_objFont = m_objRange.Font;
            m_objFont.Bold=true;
            // Transfer the recordset to the worksheet starting at cell A2.
            m_objRange = m_objSheet.get_Range("A2", m_objOpt);
            m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
            // Save the workbook and quit Excel.
            m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
            m_objBook.Close(false, m_objOpt, m_objOpt);
            m_objExcel.Quit();
            //Close the recordset and connection
            objRS.Close();
            objConn.Close();
        }
        private void Automation_QueryTable()
        {
            // Start a new workbook in Excel.
            m_objExcel = new Excel.Application();
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
            // Create a QueryTable that starts at cell A1.
            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
            m_objQryTables = m_objSheet.QueryTables;
            m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
                "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                m_strNorthwind + ";", m_objRange, "Select * From Orders");
            m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
            m_objQryTable.Refresh(false);
            // Save the workbook and quit Excel.
            m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt);
            m_objBook.Close(false, m_objOpt, m_objOpt);
            m_objExcel.Quit();
        }
        private void Use_Clipboard()
        {
            // Copy a string to the clipboard.
            string sData = "FirstName\tLastName\tBirthdate\r\n"  +
                "Bill\tBrown\t2/5/85\r\n"  +
                "Joe\tThomas\t1/1/91";
            System.Windows.Forms.Clipboard.SetDataObject(sData);
            // Start a new workbook in Excel.
            m_objExcel = new Excel.Application();
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
            // Paste the data starting at cell A1.
            m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
            m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
            m_objRange = m_objSheet.get_Range("A1", m_objOpt);
            m_objSheet.Paste(m_objRange, false);
            // Save the workbook and quit Excel.
            m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt);
            m_objBook.Close(false, m_objOpt, m_objOpt);
            m_objExcel.Quit();
        }
        private void Create_TextFile()
        {
            // Connect to the data source.
            System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
            objConn.Open();
            // Execute a command to retrieve all records from the Employees  table.
            System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand(
                "Select * From Employees", objConn);
            System.Data.OleDb.OleDbDataReader objReader;
            objReader = objCmd.ExecuteReader();
            // Create the FileStream and StreamWriter object to write
            // the recordset contents to file.
            System.IO.FileStream fs = new System.IO.FileStream(
                m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
            System.IO.StreamWriter sw = new System.IO.StreamWriter(
                fs, System.Text.Encoding.Unicode);
            // Write the field names (headers) as the first line in the text file.
            sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
                "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
                "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));
            // Write the first six columns in the recordset to a text file as
            // tab-delimited.
            while(objReader.Read())
            {
                for(int i=0;i<=5;i++)
                {
                    if(!objReader.IsDBNull(i))
                    {
                        string s;
                        s = objReader.GetDataTypeName(i);
                        if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
                        {
                            sw.Write(objReader.GetInt32(i).ToString());
                        }
                        else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
                        {
                            sw.Write(objReader.GetDateTime(i).ToString("d"));
                        }
                        else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
                        {
                            sw.Write(objReader.GetString(i));
                        }
                    }
                    if(i<5) sw.Write("\t");
                }
                sw.WriteLine();
            }
            sw.Flush();      // Write the buffered data to the FileStream.
            // Close the FileStream.
            fs.Close();
            // Close the reader and the connection.
            objReader.Close();
            objConn.Close();
            // ==================================================================
            // Optionally, automate Excel to open the text file and save it in the
            // Excel workbook format.
            // Open the text file in Excel.
            m_objExcel = new Excel.Application();
            m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
            m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1,
                Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
                false, true, false, false, false, false, m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
            m_objBook = m_objExcel.ActiveWorkbook;
            // Save the text file in the typical workbook format and quit Excel.
            m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal,
                m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt);
            m_objBook.Close(false, m_objOpt, m_objOpt);
            m_objExcel.Quit();
        }
        private void Use_ADONET()
        {
            // Establish a connection to the data source.
            System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
                "Book7.xls;Extended Properties=Excel 8.0;");
            objConn.Open();
            // Add two records to the table named 'MyTable'.
            System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
            objCmd.Connection = objConn;
            objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                " values ('Bill', 'Brown')";
            objCmd.ExecuteNonQuery();
            objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                " values ('Joe', 'Thomas')";
            objCmd.ExecuteNonQuery();
            // Close the connection.
            objConn.Close();
        }
      }  // End Class
}// End namespace
                              注意:如果您没有将 Office 安装到默认文件夹(C:\Program Files\Microsoft Office),请修改代码示例中的 m_strNorthwind 常数以匹配 Northwind.mdb 的安装路径。 | ||||||||||||
| 8. | 将下面的代码添加到 Form1.cs 中的 Using指令中: using System.Reflection; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel; | ||||||||||||
| 9. | 按 F5 生成并运行该示例。 | 
【#注:一、以上的很多方法都只能在从本地数据库导到Excel,或者要求客服端进行复杂的设置,这对远程服务器都不合适;
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号