Como transferir dados para um livro do Excel utilizando o Visual C# 2005 ou Visual C# .NET

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

Este artigo passo a passo descreve vários métodos para transferir dados para o Microsoft Excel 2002 a partir 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 possa selecionar a solução que melhor se ajusta à sua situação.

Descrição geral

A técnica que é utilizada mais frequentemente para transferir dados para um livro do Excel é a Automatização. Com a Automatização, pode chamar métodos e propriedades específicos para tarefas do Excel. A automatização dá-lhe a maior flexibilidade para especificar a localização dos seus dados no livro, formatar o livro e criar várias definições em tempo de funcionamento.

Com a Automatização, pode utilizar várias técnicas para transferir os seus dados:

  • Transferir células de dados.
  • Transferir dados numa matriz para um intervalo de células.
  • Transfira dados num conjunto de registos ADO para um intervalo de células através do método CopyFromRecordset.
  • Crie um objeto Delve numa base de dados do Excel que contenha o resultado de uma consulta numa origem de dados ODBC ou OLEDB.
  • Transfira dados para a área de transferência e, em seguida, colar os conteúdos da área de transferência numa ficha do Excel.
    Também pode utilizar vários métodos que não necessitem necessariamente de Automatização para transferir dados para o Excel. Se estiver a executar um programa do lado do servidor, esta pode ser uma boa abordagem para afastar o volume do processamento de dados dos seus clientes.

Para transferir os seus dados sem Automatização, pode utilizar as seguintes abordagens:

  • Transfira os seus dados para um ficheiro de texto delimitado por tabulações ou separados por 0 0, que o Excel pode analisar mais tarde em células numa folha de dados.
  • Transfira os seus dados para uma ficha de trabalho utilizando 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 um debate e um exemplo de código para cada uma destas técnicas. A secção "Create the Complete Sample Visual C# 2005 ou Visual C# .NET Project" (Criar a secção Visual C# 2005 ou Visual C# .NET Project) mais adiante neste artigo demonstra como criar um programa visual C# .NET que executa cada técnica.

Técnicas

Utilizar a Automatização para Transferir Células de Dados por Célula

Com a Automatização, pode transferir dados para uma ficha de cada 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élulas de dados é uma abordagem aceitável se tiver uma pequena quantidade de dados. Tem a flexibilidade de colocar dados em qualquer parte do livro e pode formatar as células condicionalmente no tempo de funcionamento. No entanto, não é boa ideia utilizar esta abordagem se tiver uma grande quantidade de dados para transferir para um livro do Excel. Cada objeto de Intervalo que adquire em tempo de resposta resulta num pedido de interface que significa transferência de dados mais lentamente. Além disso, o Microsoft Windows 95, Microsoft Windows 98 e Microsoft Windows Edition (Eu) têm uma limitação de 64 quilobyte (KB) relativamente a pedidos de interface. Se tiver mais de 64 KB de pedidos de interface, o servidor de automatização (Excel) poderá deixar de responder ou poderá receber mensagens de erro que indicam memória baixa.

Mais uma vez, a transferência de células de dados é aceitável apenas para pequenas quantidades de dados. Se tiver de transferir grandes conjuntos de dados para o Excel, considere utilizar uma das outras abordagens debatidas neste artigo para transferir dados em massa.

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

302084 COMO: Automatizar o Microsoft Excel a partir do Microsoft Visual C# .NET

Utilizar a Automatização para Transferir uma Matriz de Dados para um Intervalo numa Ficha

Pode transferir uma matriz de dados para um intervalo de múltiplas 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 transferir os seus dados utilizando uma matriz em vez de célula por célula, pode aperceber-se de um desempenho bastante ganho com uma grande quantidade de dados. Considere as seguintes linhas a partir do código já vem a partir do código que transfere dados para 300 células na mesma:

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

Este código representa dois pedidos de interface: um para o objeto Intervalo que o método Intervalo devolve e outro para o objeto Intervalo devolvê-lo. Por outro lado, transferir a célula de dados por célula requer pedidos de 300 interfaces para objetos de Intervalo. Sempre que possível, pode beneficiar da transferência dos seus dados em volume e da redução do número de pedidos de interface que fizer.

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

302096 COMO: Automatizar o Excel com Visual C# .NET Para Preencher ou Obter Dados num Intervalo Utilizando Matrizes

Utilizar a Automatização para Transferir um Conjunto de Registos ADO para um Intervalo da Ficha

Os modelos de objetos para o Excel 2000, Excel 2002 e Excel 2003 fornecem o método CopyFromRecordset para transferir um conjunto de registos ADO para um intervalo numa livro. O seguinte código ilustra como automatizar o Excel para transferir os conteúdos da tabela Encomendas na base de dados de exemplo da Northwind através do 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();

Nota

O copyFromRecordset só funciona com objetos ADO Recordset. Não pode utilizar o Conjunto de Dados que cria utilizando ADO.NET com o método CopyFromRecordset. Vários exemplos nas secções seguintes demonstram como transferir dados para o Excel com ADO.NET.

Utilizar a Automatização para Criar um Objeto Delize de Consulta numa Base de Trabalho

Um objeto Tabela de Consulta representa uma tabela criada a partir de dados devolvidos a partir de uma origem de dados externa. Ao automatizar o Excel, pode criar uma Consulta Ao fornecer uma cadeia de ligação a uma origem de dados OLE DB ou ODBC e a uma cadeia SQL. O Excel gera o registo e insere o mesmo na mesma na localização que especificar. Os objetos de Tabela de Consulta oferecem as seguintes vantagens em vez do método CopyFromRecordset:

  • O Excel lida com a criação do mesmo e a sua colocação na mesma.
  • Pode guardar a consulta com o objeto QueryTable e atualizá-la mais tarde para obter um registo atualizado.
  • Quando é adicionada uma nova Estrutura de Consulta à sua livro, pode especificar que os dados já existentes nas células na mesma são alterados para lidar com os novos dados (para obter mais informações, consulte a propriedade TipoDa Atualização).

O seguinte código demonstra como automatizar o Excel 2000, Excel 2002 ou Excel 2003 para criar uma nova Tabela de Consulta numa livro do Excel ao utilizar dados da base de dados de exemplo da 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();

Utilizar a Área de Transferência do Windows

Pode utilizar a Área de Transferência do Windows para transferir dados para uma mesma. Para colar dados em múltiplas células numa folha de dados, pode copiar uma cadeia na qual as colunas são delimitadas por carateres de TABILHAR e as linhas são delimitadas por retornos de retorno. O seguinte código ilustra a forma como o Visual C# .NET pode utilizar 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 Ficheiro de Texto Delimitado que o Excel pode Analisar em Linhas e Colunas

O Excel pode abrir ficheiros separados por tabulações ou 10 delimitados por 0 e analisar corretamente os dados em células. Pode utilizar esta funcionalidade quando pretender transferir uma grande quantidade de dados para uma mesma e utilizar pouca ou nenhuma automatização. Esta pode ser uma boa abordagem para um programa de servidor de cliente porque o ficheiro de texto pode ser gerado no lado do servidor. Em seguida, pode abrir o ficheiro de texto no cliente, utilizando Automatização onde for adequado.

O seguinte código ilustra como pode gerar um ficheiro de texto delimitado por tabuadas a partir de dados que são 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ódigoforementado não utiliza Automatização. No entanto, se quiser, pode utilizar a Automatização para abrir o ficheiro de texto e guardar o ficheiro no formato de livro 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 Ficha de ADO.NET

Pode utilizar o fornecedor Microsoft Jet OLE DB para adicionar registos a uma tabela num livro 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 campos) e todas as linhas posteriores no intervalo contêm os registos.

O seguinte código adiciona dois novos registos a uma tabela no Book7.xls. A tabela neste caso é a Folha1:

// 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 adiciona registos com ADO.NET conforme mostrado neste exemplo, a formatação no livro é mantida. Cada registo adicionado a uma linha pede emprestado o formato da linha antes do mesmo.

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

306636 COMO: Ligar a uma Base de Dados e Executar um Comando Utilizando ADO.NET Visual C# .NET

314145 COMO : Preencher um Objeto DataSet a partir de uma Base de Dados Utilizando Visual C# .NET

307587 COMO : Atualizar uma Base de Dados a partir de um Objeto DataSet utilizando Visual C# .NET

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

278973 EXEMPLO: o ExcelADO Demonstra como Utilizar o ADO para Ler e Escrever Dados em Livros do Excel

257819 HOWTO: Utilizar o ADO com dados do Excel a partir do Visual Basic ou VBA

Transferir Dados XML (Excel 2002 e Excel 2003)

O Excel 2002 e 2003 podem abrir qualquer ficheiro XML bem formado. Pode abrir ficheiros XML diretamente ao utilizar o comando Abrir no menu Ficheiro ou através de programação através dos métodos Abrir ou OpenXML da coleção Livros. Se criar ficheiros XML para utilizar no Excel, também pode criar folhas de estilo para formatar os dados.

Criar o Projeto Visual de Exemplo Completo C# .NET

  1. Crie uma nova pasta denominada C:\ExcelData. O programa de exemplo irá armazenar os livros do Excel nesta pasta.

  2. Crie um novo livro para o exemplo escrever:

    1. Inicia um novo livro no Excel.
    2. Na Folha1 do novo livro, escreva PrimeiroNome nas células A1 e Apelido na célula B1.
    3. Selecione A1:B1.
    4. No menu Inserir, aponte para Nome e, em seguida, clique em Definir. Escreva o nome A MinhaTatable e, em seguida, clique em OK.
    5. Guarde o livro como C:\Exceldata\Book7.xls.
    6. Saia do Excel.
  3. Inicia o Microsoft Visual Studio 2005 ou o Microsoft Visual Studio .NET. No menu Ficheiro, aponte para Novo e, em seguida, clique em Projeto. Em Projetos Visual C# ou Visual C#, selecione Aplicação do Windows. Por predefinição, é criado o Formulário1.

  4. Adicione uma referência à biblioteca de objetos do Excel e à assemblagem de intervalo principal do ADODB. Para tal, siga estes passos:

    1. No menu Projeto, clique em Adicionar Referência.
    2. No separador NET, localize ADODB e, em seguida, clique em Selecionar.

    Nota No Visual Studio 2005, não tem de clicar em Selecionar.
    3. No separador COM, localize Biblioteca de Objetos do Microsoft Excel 10.0 ou Biblioteca de Objetos do Microsoft Excel 11.0 e, em seguida, clique em Selecionar.

    Nota No Visual Studio 2005, não tem de clicar em Selecionar.

    Nota: se estiver a utilizar o Microsoft Excel 2002 e ainda não o tiver feito, a Microsoft recomenda que transfira e, em seguida, instale as Assemblagens de Interopa Principais (PIAs) do Microsoft Office XP.

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

  6. Adicione um controlo de Caixa de Combinação e um Controlo de Botão ao Formulário1.

  7. Adicione os controladores de eventos para o evento Carregamento de Formulários e os eventos Click do controlo Button:

    1. Na vista Estrutura do Formulário1.cs, faça duplo clique em Formulário1.

    O handler do evento Load do Formulário é criado e aparece em Form1.cs.
    2. No menu Ver, clique em Estruturador para mudar para a vista de estrutura.
    3. Faça duplo clique em Botão1.

    O alça do evento Click do botão é criado e aparece em Formulário1.cs.

  8. Em Formulário1.cs, substitua o seguinte código:

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

    com:

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

    Nota Tem de alterar o código no Visual Studio 2005. Por predefinição, o Visual C# adiciona um formulário ao projeto quando cria um Windows Forms projeto. O formulário tem o nome Formulário1. Os dois ficheiros que representam o formulário são denominados Formulário1.cs e Form1.designer.cs. O código é escrito no Formulário1.cs. O ficheiro Form1.designer.cs é onde o Estruturador do Windows Forms escreve o código que implementa todas as ações que efetuou ao arrastar e largar controlos da Caixa de Ferramentas.

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

    Criar um Projeto (Visual C#) Nota: se não instalou o Office na pasta predefinida (C:\Program Files\Microsoft Office), modifique a constante m_strNorthwind no exemplo de código para corresponder ao caminho de instalação da Northwind.mdb.

  9. Adicione o seguinte às diretrizes Utilizar no Form1.cs:

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

Referências

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

Desenvolvimento do Microsoft Office com Visual Studio