Compartilhar via


Como transferir dados para uma pasta de trabalho do Excel usando o Visual C# 2005 ou o Visual C# .NET

Para obter uma versão do Microsoft Visual Basic 6.0 deste artigo, consulte 247412.

Este artigo passo a passo descreve vários métodos para transferir dados para o Microsoft Excel 2002 de um programa Microsoft Visual C# 2005 ou Microsoft Visual C# .NET. Este artigo também apresenta as vantagens e desvantagens de cada método para que você possa selecionar a solução que funciona melhor para sua situação.

Visão geral

A técnica usada com mais frequência para transferir dados para uma pasta de trabalho do Excel é a Automação. Com a Automação, você pode chamar métodos e propriedades específicas para tarefas do Excel. A automação oferece a maior flexibilidade para especificar o local dos dados na pasta de trabalho, formatar a pasta de trabalho e fazer várias configurações em tempo de execução.

Com a Automação, você pode usar várias técnicas para transferir seus dados:

  • Transferir célula de dados por célula.
  • Transferir dados em uma matriz para um intervalo de células.
  • Transfira dados em um conjunto de registros do ADO para um intervalo de células usando o método CopyFromRecordset.
  • Crie um objeto QueryTable em uma planilha do Excel que contenha o resultado de uma consulta em uma fonte de dados ODBC ou OLEDB.
  • Transfira dados para a área de transferência e cole o conteúdo da área de transferência em uma planilha do Excel.
    Você também pode usar vários métodos que não exigem necessariamente que a Automação transfira dados para o Excel. Se você estiver executando um programa do lado do servidor, essa pode ser uma boa abordagem para tirar a maior parte do processamento de dados de seus clientes.

Para transferir seus dados sem Automação, você pode usar as seguintes abordagens:

  • Transfira seus dados para um arquivo de texto delimitado por tabulação ou delimitado por vírgula que o Excel possa analisar posteriormente em células em uma planilha.
  • Transfira seus dados para uma planilha usando ADO.NET.
  • Transfira dados XML para o Excel (versão 2002 e 2003) para fornecer dados formatados e organizados em linhas e colunas.

Este artigo fornece uma discussão e um exemplo de código para cada uma dessas técnicas. A seção "Criar o Visual C# 2005 ou o Projeto .NET do Visual C# completo", mais adiante neste artigo, demonstra como criar um programa .NET do Visual C# que executa cada técnica.

Técnicas

Usar Automação para Transferir Célula de Dados por Célula

Com a Automação, você pode transferir dados para uma planilha uma célula por vez:

// 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();

Transferir célula de dados por célula é uma abordagem aceitável se você tiver uma pequena quantidade de dados. Você tem a flexibilidade de colocar dados em qualquer lugar na pasta de trabalho e pode formatar as células condicionalmente em tempo de execução. No entanto, não é uma boa ideia usar essa abordagem se você tiver uma grande quantidade de dados para transferir para uma pasta de trabalho do Excel. Cada objeto Range adquirido em tempo de execução resulta em uma solicitação de interface que significa transferências de dados mais lentamente. Além disso, o Microsoft Windows 95, o Microsoft Windows 98 e o Microsoft Windows Millennium Edition (Eu) têm uma limitação de 64 quilobytes (KB) em solicitações de interface. Se você tiver mais de 64 KB de solicitações de interface, o servidor de Automação (Excel) poderá parar de responder ou você poderá receber mensagens de erro que indicam memória insuficiente.

Novamente, transferir célula de dados por célula é aceitável apenas para pequenas quantidades de dados. Se você precisar transferir grandes conjuntos de dados para o Excel, considere usar uma das outras abordagens discutidas neste artigo para transferir dados em massa.

Para obter informações adicionais e para obter um exemplo de automatização do Excel com o .NET do Visual C#, clique no número do artigo abaixo para exibir o artigo na Base de Dados de Conhecimento Microsoft:

302084 HOWTO: Automatizar o Microsoft Excel do Microsoft Visual C# .NET

Usar a Automação para transferir uma matriz de dados para um intervalo em uma planilha

Você pode transferir uma matriz de dados para um intervalo de várias células ao mesmo tempo:

// 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();

Se você transferir seus dados usando uma matriz em vez de célula por célula, poderá obter um enorme ganho de desempenho com uma grande quantidade de dados. Considere as seguintes linhas do código mencionado anteriormente que transferem dados para 300 células na planilha:

objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;

Esse código representa duas solicitações de interface: uma para o objeto Range que o método Range retorna e outra para o objeto Range que o método Resize retorna. Por outro lado, transferir a célula de dados por célula requer solicitações de 300 interfaces para objetos Range. Sempre que possível, você pode se beneficiar de transferir seus dados em massa e reduzir o número de solicitações de interface feitas.

Para obter informações adicionais sobre como usar matrizes para obter e definir valores em intervalos com a Automação do Excel, clique no número do artigo abaixo para exibir o artigo na Base de Dados de Conhecimento Microsoft:

302096 HOWTO: automatizar o Excel com o Visual C# .NET para preencher ou obter dados em um intervalo usando matrizes

Usar a Automação para transferir um conjunto de registros do ADO para um intervalo de planilhas

Os modelos de objeto para Excel 2000, Excel 2002 e Excel 2003 fornecem o método CopyFromRecordset para transferir um conjunto de registros do ADO para um intervalo em uma planilha. O código a seguir ilustra como automatizar o Excel para transferir o conteúdo da tabela Orders no banco de dados de exemplo Northwind usando o método CopyFromRecordset:

// Create a Recordset from all the records in the Orders table.
ADODB.Connection objConn = new ADODB.Connection();
ADODB._Recordset objRS = null;
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_strNorthwind + ";", "", "", 0);
objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
object objRecAff;
objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, 
(int)ADODB.CommandTypeEnum.adCmdTable);

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));

// Get the Fields collection from the recordset and determine
// the number of fields (or columns).
System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
int nFields = objRS.Fields.Count;

// Create an array for the headers and add it to the
// worksheet starting at cell A1.
object[] objHeaders = new object[nFields];
ADODB.Field objField = null;
for(int n=0;n<nFields;n++)
{
objFields.MoveNext();
objField = (ADODB.Field)objFields.Current;
objHeaders[n] = objField.Name;
}
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objRange = m_objRange.get_Resize(1, nFields);
m_objRange.Value = objHeaders;
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Transfer the recordset to the worksheet starting at cell A2.
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

// Close the recordset and connection.
objRS.Close();
objConn.Close();

Observação

CopyFromRecordset funciona apenas com objetos recordset do ADO. Você não pode usar o DataSet criado usando ADO.NET com o método CopyFromRecordset. Vários exemplos nas seções a seguir demonstram como transferir dados para o Excel com ADO.NET.

Usar Automação para criar um objeto QueryTable em uma planilha

Um objeto QueryTable representa uma tabela criada a partir de dados retornados de uma fonte de dados externa. Ao automatizar o Excel, você pode criar uma QueryTable fornecendo uma cadeia de conexão para um OLE DB ou uma fonte de dados ODBC e uma cadeia de caracteres SQL. O Excel gera o conjunto de registros e insere o conjunto de registros na planilha no local especificado. Os objetos QueryTable oferecem as seguintes vantagens em relação ao método CopyFromRecordset:

  • O Excel lida com a criação do conjunto de registros e seu posicionamento na planilha.
  • Você pode salvar a consulta com o objeto QueryTable e atualize-a posteriormente para obter um conjunto de registros atualizado.
  • Quando uma nova QueryTable é adicionada à planilha, você pode especificar que os dados que já existem nas células da planilha sejam deslocados para lidar com os novos dados (para obter mais informações, consulte a propriedade RefreshStyle).

O código a seguir demonstra como automatizar o Excel 2000, Excel 2002 ou Excel 2003 para criar uma nova QueryTable em uma planilha do Excel usando dados do banco de dados de exemplo Northwind:

// 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();

Usar a Área de Transferência do Windows

Você pode usar a Área de Transferência do Windows para transferir dados para uma planilha. Para colar dados em várias células em uma planilha, você pode copiar uma cadeia de caracteres na qual as colunas são delimitadas por caracteres TAB e as linhas são delimitadas por retornos de carro. O código a seguir ilustra como o Visual C# .NET pode usar a Área de Transferência do Windows para transferir dados para o 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();

Criar um arquivo de texto delimitado que o Excel possa analisar em linhas e colunas

O Excel pode abrir arquivos delimitados por tabulação ou vírgula e analisar corretamente os dados em células. Você pode usar esse recurso quando quiser transferir uma grande quantidade de dados para uma planilha enquanto usa pouca Automação, se houver. Essa pode ser uma boa abordagem para um programa cliente-servidor porque o arquivo de texto pode ser gerado no lado do servidor. Em seguida, você pode abrir o arquivo de texto no cliente, usando a Automação onde for apropriado.

O código a seguir ilustra como gerar um arquivo de texto delimitado por tabulação de dados lidos com 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(); 

O código mencionado anteriormente não usa automação. No entanto, se desejar, você pode usar a Automação para abrir o arquivo de texto e salvar o arquivo no formato de pasta de trabalho do Excel, semelhante a este:

// 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();

Transferir dados para uma planilha usando ADO.NET

Você pode usar o provedor OLE DB do Microsoft Jet para adicionar registros a uma tabela em uma pasta de trabalho existente do Excel. Uma tabela no Excel é apenas um intervalo de células; o intervalo pode ter um nome definido. Normalmente, a primeira linha do intervalo contém os cabeçalhos (ou nomes de campo) e todas as linhas posteriores no intervalo contêm os registros.

O código a seguir adiciona dois novos registros a uma tabela em Book7.xls. Nesse caso, a tabela é 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();

Quando você adiciona registros com ADO.NET conforme mostrado neste exemplo, a formatação na pasta de trabalho é mantida. Cada registro adicionado a uma linha empresta o formato da linha antes dele.

Para obter informações adicionais sobre como ADO.NET, clique nos números de artigo abaixo para exibir os artigos na Base de Dados de Conhecimento Microsoft:

306636 como conectar-se a um banco de dados e executar um comando usando ADO.NET e o .NET do Visual C#

314145 INSTRUÇÕES: Popular um objeto DataSet de um banco de dados usando o .NET do Visual C#

307587 COMO atualizar um banco de dados de um objeto DataSet usando o .NET do Visual C#

Para obter informações adicionais sobre como usar o provedor Jet OLEDB com fontes de dados do Excel, clique nos números de artigo abaixo para exibir os artigos na Base de Dados de Conhecimento Microsoft:

278973 EXEMPLO: ExcelADO demonstra como usar o ADO para ler e gravar dados em pastas de trabalho do Excel

257819 HOWTO: usar o ADO com dados do Excel do Visual Basic ou do VBA

Transferir dados XML (Excel 2002 e Excel 2003)

O Excel 2002 e 2003 podem abrir qualquer arquivo XML bem formado. Você pode abrir arquivos XML diretamente usando o comando Abrir no menu Arquivo ou programaticamente usando os métodos Open ou OpenXML da coleção Workbooks. Se você criar arquivos XML para uso no Excel, também poderá criar folhas de estilos para formatar os dados.

Criar o projeto .NET do Visual C# de exemplo completo

  1. Crie uma nova pasta chamada C:\ExcelData. O programa de exemplo armazenará pastas de trabalho do Excel nessa pasta.

  2. Crie uma nova pasta de trabalho para o exemplo a ser gravado:

    1. Inicie uma nova pasta de trabalho no Excel.
    2. Na Planilha1 da nova pasta de trabalho, digite FirstName na célula A1 e LastName na célula B1.
    3. Selecione A1:B1.
    4. No menu Inserir, aponte para Nome e clique em Definir. Digite o nome MyTable e clique em OK.
    5. Salve a pasta de trabalho como C:\Exceldata\Book7.xls.
    6. Saia do Excel.
  3. Inicie o Microsoft Visual Studio 2005 ou o Microsoft Visual Studio .NET. No menu arquivo, aponte para novo e, em seguida, clique em Project. Em Projetos do Visual C# ou Visual C#, selecione Aplicativo do Windows. Por padrão, Form1 é criado.

  4. Adicione uma referência à biblioteca de objetos do Excel e ao assembly de interoperabilidade primário do ADODB. Para fazer isso, siga estas etapas:

    1. On the Project menu, click Add Reference.
    2. Na guia NET, localize o ADODB e clique em Selecionar.

    Observação No Visual Studio 2005, você não precisa clicar em Selecionar.
    3. Na guia COM, localize a Biblioteca de Objetos do Microsoft Excel 10.0 ou a Biblioteca de Objetos do Microsoft Excel 11.0 e clique em Selecionar.

    Observação No Visual Studio 2005, você não precisa clicar em Selecionar.

    Observação Se você estiver usando o Microsoft Excel 2002 e ainda não tiver feito isso, a Microsoft recomenda que você baixe e instale os PIAs (assemblies de interoperabilidade primários) do Microsoft Office XP.

  5. Na caixa de diálogo Adicionar Referências, clique em OK para aceitar suas seleções.

  6. Adicione um controle Caixa de Combinação e um controle Button ao Form1.

  7. Adicione manipuladores de eventos para o evento Carga de Formulário e os eventos Click do controle Button:

    1. No modo de exibição de design para Form1.cs, clique duas vezes em Form1.

    O manipulador para o evento Load do formulário é criado e aparece em Form1.cs.
    2. No menu Exibir, clique em Designer para alternar para o modo design.
    3. Clique duas vezes em Button1.

    O manipulador do evento Click do botão é criado e aparece em Form1.cs.

  8. Em Form1.cs, substitua o seguinte código:

    private void Form1_Load(object sender, System.EventArgs e)
    {
    
    }
    
    private void button1_Click(object sender, System.EventArgs e)
    {
    
    }
    
    

    por:

            // 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
    
    

    Observe que você deve alterar o código no Visual Studio 2005. Por padrão, o Visual C# adiciona um formulário ao projeto quando você cria um Windows Forms projeto. O formulário é denominado Form1. Os dois arquivos que representam o formulário são chamados Form1.cs e Form1.designer.cs. Você escreve o código em Form1.cs. O arquivo Form1.designer.cs é onde o designer Windows Forms grava o código que implementa todas as ações executadas arrastando e soltando controles da Caixa de Ferramentas.

    Para obter mais informações sobre o designer Windows Forms no Visual C# 2005, visite o seguinte site do MSDN (Microsoft Developer Network):

    Criando um projeto (Visual C#) Observação Se você não instalou o Office na pasta padrão (C:\Arquivos de Programas\Microsoft Office), modifique a constante m_strNorthwind no exemplo de código para corresponder ao caminho de instalação para Northwind.mdb.

  9. Adicione o seguinte às diretivas Using em Form1.cs:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Pressione F5 para criar e executar o exemplo.

Referências

Para obter mais informações, acesse o seguinte site da Microsoft:

Desenvolvimento do Microsoft Office com o Visual Studio