Artigo: 306023 - Última revisão: segunda-feira, 11 de Dezembro de 2006 - Revisão: 7.5

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

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 306022  (http://support.microsoft.com/kb/306022/ ) .
Para obter uma versão de Microsoft Visual Basic 6.0 deste artigo, consulte 247412  (http://support.microsoft.com/kb/247412/ ) .

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo passo a passo descreve vários métodos para transferir dados para o Microsoft Excel 2002 de um programa do Microsoft Visual C# 2005 ou do Microsoft Visual C# .NET. Este artigo apresenta também as vantagens e desvantagens de cada método de modo a que pode seleccionar a solução mais adequado à sua situação.

Descrição geral

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

Com a automatização, pode utilizar várias técnicas para transferir os dados:
  • Transferir dados célula a célula.
  • Transferir dados de uma matriz para um intervalo de células.
  • Transferir dados de um conjunto de registos ADO para um intervalo de células utilizando o método CopyFromRecordset .
  • Crie um objecto de tabela de consulta numa folha de cálculo Excel que contém o resultado de uma consulta numa origem de dados ODBC ou OLEDB.
  • Transferir dados para a área de transferência e, em seguida, cole o conteúdo da área de transferência para uma folha de cálculo do Excel.
Pode também utilizar vários métodos que não requerem necessariamente automatização transferir dados para o Excel. Se estiver a executar um programa do lado do servidor, este pode ser uma boa abordagem para tomar em massa do processamento de dados longe dos clientes.

Para transferir os dados sem automatização, pode utilizar as seguintes abordagens:
  • Transferir os dados para um ficheiro texto delimitado por tabulações ou delimitado por vírgulas que o Excel possa distribuir posteriormente em células numa folha de cálculo.
  • Transferir os dados para uma folha de cálculo utilizando ADO.NET.
  • Transferir dados XML para o Excel (versão 2002 e 2003) para fornecer dados formatados e organizados em linhas e colunas.
Este artigo fornece uma descrição e um exemplo de código para cada uma das seguintes técnicas. A Create the Complete Sample Visual C# 2005 or Visual C# .NET Project secção, mais adiante neste artigo demonstra como criar um programa do Visual C# .NET que executa cada técnica.

Técnicas

Utilizar a automatização para transferir dados célula por célula

Com a automatização, pode transferir dados para uma célula de uma folha de cálculo 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));

// 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 dados célula a célula é uma abordagem aceitável se tiver uma pequena quantidade de dados. Tem a flexibilidade para colocar dados em qualquer parte do livro e pode formatar as células condicionalmente em tempo de execução. No entanto, não é uma boa ideia utilizar este método se tiver uma grande quantidade de dados para transferir para um livro do Excel. Cada objecto de intervalo que adquirir em tempo de execução resulta num pedido de interface significa dados transfere mais lentamente. Além disso, Microsoft Windows 95, Microsoft Windows 98 e Microsoft Windows Millennium Edition (Me) têm uma limitação de 64 kilobyte (KB) pedidos de interface. Se tiver mais do que 64 KB de pedidos de interface, o servidor de automatização (Excel) poderá deixar de responder ou poderá receber mensagens de erro indicando falta de memória. Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
216400  (http://support.microsoft.com/kb/216400/EN-US/ ) PROBLEMA: Processo de acesso COM automatização pode bloqueio aplicações de cliente Win95/98
Novamente, transferir dados célula a célula é aceitável apenas para pequenas quantidades de dados. Se tem de transferir grandes conjuntos de dados para o Excel, considere utilizar uma das abordagens são abordadas neste artigo para transferir dados em massa.

Para obter informações adicionais e para obter um exemplo do Excel automatizar com o Visual C# .NET, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
302084  (http://support.microsoft.com/kb/302084/EN-US/ ) 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 folha de cálculo

Pode transferir uma matriz de dados para um intervalo de várias células simultaneamente:
// 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 dados utilizando uma matriz em vez de célula a célula, pode reconhecer um ganho em desempenho enorme com uma grande quantidade de dados. Considere as seguintes linhas contra o código supramencionado que transferir dados para 300 células na folha de cálculo:
objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;
				
este código representa dois pedidos de interface: uma para o objecto Range que devolve o método de intervalo e outra para o objecto Range que devolve o método de redimensionar . Em contrapartida, transferir dados célula a célula requer pedidos para 300 interfaces para objectos de intervalo . Sempre que possível, pode beneficiar de transferir os dados em massa e reduzir o 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 automatização do Excel, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
302096  (http://support.microsoft.com/kb/302096/EN-US/ ) COMO: Automatizar o Excel com o Visual C# .NET para preencher ou obter dados de um intervalo com matrizes

Utilizar a automatização para transferir um conjunto de registos ADO para um intervalo de folha de cálculo

Os modelos de objecto 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 folha de cálculo. O seguinte código ilustra como automatizar o Excel para transferir o conteúdo da tabela Encomendas na base de dados de exemplo Adamastor utilizando 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();
				
Nota CopyFromRecordset só funciona com objectos de conjunto de registos do ADO. Pode utilizar o DataSet que criar utilizando o ADO.NET com o método CopyFromRecordset . Vários exemplos nas secções que se seguem demonstram como transferir dados para o Excel com o ADO.NET.

Utilizar a automatização para criar um objecto de tabela de consulta numa folha de cálculo

Um objecto de tabela de consulta representa uma tabela baseia-se dos dados de que são devolvidos a partir de uma origem de dados externa. Ao automatizar o Excel, é possível criar uma tabela de consulta , fornecendo uma cadeia de ligação para um OLE DB ou uma origem de dados ODBC e uma cadeia de SQL. O Excel gera o conjunto de registos e insere o conjunto de registos na folha de cálculo na localização que especificar. tabela de consulta objectos oferecem as seguintes vantagens sobre o método CopyFromRecordset :
  • Excel processa a criação de conjunto de registos e respectiva colocação na folha de cálculo.
  • Pode guardar a consulta com o objecto de tabela de consulta e actualizá-lo mais tarde para obter um conjunto de registos actualizado.
  • Quando uma nova tabela de consulta é adicionado à folha de cálculo, pode especificar a movimentação de dados que já existem nas células da folha de cálculo para processar os novos dados (para mais informações, consulte a propriedade RefreshStyle ).
O seguinte código demonstra como automatizar o Excel 2000, o Excel 2002 ou o Excel 2003 para criar uma nova tabela de consulta numa folha de cálculo do Excel utilizando dados da base de dados de exemplo Adamastor:
// 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 folha de cálculo. Para colar dados em várias células numa folha de cálculo, pode copiar uma cadeia na qual colunas estejam delimitadas por caracteres de tabulação e linhas estejam delimitadas por símbolos de retorno. O seguinte código ilustra como o Visual C# .NET podem 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 delimitada que o Excel pode analisar em linhas e colunas

Excel pode abrir ficheiros delimitado por tabulações ou vírgulas e analisar correctamente os dados nas células. Pode utilizar esta funcionalidade quando pretender transferir uma grande quantidade de dados para uma folha de cálculo durante a utilização pouco, caso exista, automatização. Isto pode ser uma boa abordagem para um programa cliente servidor porque o ficheiro de texto pode ser gerado no servidor. Em seguida, é possível abrir o ficheiro de texto no cliente, utilizando a automatização onde é apropriado.

O seguinte código ilustra como gerar um ficheiro de texto delimitado por tabulações a partir de dados lidos com o 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 supramencionado utiliza não automatização. No entanto, se pretender, pode utilizar automatização para abrir o ficheiro de texto e guarde o ficheiro no formato de livro do Excel, semelhante ao seguinte:
// 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 folha de cálculo utilizando o ADO.NET

Pode utilizar o Microsoft Jet fornecedor de OLE DB para adicionar registos a uma tabela de um livro do Excel existente. 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 de contêm os registos.

O seguinte código adiciona dois novos registos a uma tabela Book7.xls. Neste caso, a tabela é 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 adicionar registos com o ADO.NET como demonstra este exemplo, a formatação no livro é mantida. Cada registo é adicionado a uma linha assume o formato da linha anterior.

Para obter informações adicionais sobre como utilizar ADO.NET, clique os números de artigo existente abaixo para visualizar os artigos na base de dados de conhecimento da Microsoft:
306636  (http://support.microsoft.com/kb/306636/EN-US/ ) COMO: Ligar a uma base de dados e executar um comando utilizando o ADO.NET e Visual C# .NET
314145  (http://support.microsoft.com/kb/314145/EN-US/ ) COMO: Preencher um objecto de DataSet a partir de uma base de dados utilizando o Visual C# .NET
307587  (http://support.microsoft.com/kb/307587/EN-US/ ) COMO: Actualizar uma base de dados de um objecto de DataSet utilizando o Visual C# .NET
Para obter informações adicionais sobre como utilizar o fornecedor OLEDB Jet com origens de dados do Excel, clique os números de artigo existente abaixo para visualizar os artigos na base de dados de conhecimento da Microsoft:
316934  (http://support.microsoft.com/kb/316934/EN-US/ ) COMO: Utilizar o ADO.NET para obter e modificar registos de um livro do Excel com o Visual Basic .NET
278973  (http://support.microsoft.com/kb/278973/EN-US/ ) EXEMPLO: ExcelADO demonstra como utilizar ADO para ler e escrever dados nos livros do Excel
257819  (http://support.microsoft.com/kb/257819/EN-US/ ) COMO: Utilizar o ADO com dados do Excel a partir do Visual Basic ou VBA

Transferir dados XML (Excel 2002 e Excel 2003)

Excel 2002 e 2003 poderá abrir qualquer ficheiro XML que está correctamente formado. Pode abrir ficheiros XML directamente utilizando o comando Abrir no menu ficheiro ou, programaticamente, utilizando o Abrir ou métodos OpenXML da colecção de livros . Se criar ficheiros XML para utilização no Excel, também pode criar folhas de estilos para formatar os dados.

Para obter informações adicionais sobre como utilizar XML com o Excel 2002, clique os números de artigo existente abaixo para visualizar os artigos na base de dados de conhecimento da Microsoft:
307029  (http://support.microsoft.com/kb/307029/EN-US/ ) COMO: Transferir dados XML para a Microsoft Excel 2002 utilizando o Visual C# .NET
288215  (http://support.microsoft.com/kb/288215/EN-US/ ) INFO: Microsoft Excel 2002 e XML

Criar o concluída Visual C# .NET projecto de exemplo

  1. Crie uma nova pasta denominada C:\ExcelData. O programa de exemplo armazena livros do Excel nesta pasta.
  2. Crie um novo livro para o exemplo escrever:
    1. Inicie um novo livro no Excel.
    2. Na Folha1 do novo livro, escreva o nome na célula A1 e Apelido na célula B1.
    3. Seleccione A1:B1.
    4. No menu Inserir , aponte para Nome e, em seguida, clique em Definir . Escreva o nome MinhaTabela e, em seguida, clique em OK .
    5. Guarde o livro como C:\Exceldata\Book7.xls .
    6. Saia do Excel.
  3. Inicie o Microsoft Visual Studio 2005 ou Microsoft Visual Studio .NET. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto . Em Projectos do Visual C# ou Visual C# , seleccione a Aplicação do Windows . Por predefinição, é criado o Form1.
  4. Adicione uma referência para a biblioteca de objectos do Excel e a assemblagem de interoperabilidade primária ADODB. Para o fazer, siga estes passos:
    1. No menu projecto , clique em Add Reference .
    2. No separador NET , localize ADODB e, em seguida, clique em Seleccionar .

      Nota No Visual Studio 2005, não é necessário clique em Seleccionar .
    3. No separador COM , localize Microsoft Excel 10.0 Object Library ou Microsoft Excel 11.0 Object Library e, em seguida, clique em Seleccionar .

      Nota No Visual Studio 2005, não é necessário clique em Seleccionar .

      Nota Se estiver a utilizar Microsoft Excel 2002 e não o tiver já feito, a Microsoft recomenda que transfira e instale os Microsoft Office XP Primary Interop Assemblies (PIAs). Para obter mais informações sobre PIAs do Office XP, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
      328912  (http://support.microsoft.com/kb/328912/ ) INFO: PIAs do Microsoft Office XP estão disponíveis para transferência
    4. Na caixa de diálogo Adicionar referências , clique em OK para aceitar as selecções.
  5. Adicione um controlo de Caixa de combinação e um controlo de botão ao Form1.
  6. Adicione processadores de eventos para o evento de formulário de carga e os eventos clique do botão de controlo:
    1. Na vista de estrutura para Form1.cs, faça duplo clique Form1 .

      O processador de evento de carregar o formulário é criado e é apresentado no Form1.cs.
    2. No menu Ver , clique em Designer para mudar para vista de estrutura.
    3. Faça duplo clique em Button1 .

      O processador de evento Click do botão é criado e é apresentado no Form1.cs.
  7. In Form1.cs, replace the following code:
    private void Form1_Load(object sender, System.EventArgs e)
    {
    
    }
    
    private void button1_Click(object sender, System.EventArgs e)
    {
    
    }
    					
    with:
            // Excel object references.
            private Excel.Application m_objExcel =  null;
            private Excel.Workbooks m_objBooks = null;
            private Excel._Workbook m_objBook = null;
            private Excel.Sheets m_objSheets = null;
            private Excel._Worksheet m_objSheet = null;
            private Excel.Range m_objRange =  null;
            private Excel.Font m_objFont = null;
            private Excel.QueryTables m_objQryTables = null;
            private Excel._QueryTable m_objQryTable = null;
    
            // Frequenty-used variable for optional arguments.
            private object m_objOpt = System.Reflection.Missing.Value;
    
            // Paths used by the sample code for accessing and storing data.
            private object m_strSampleFolder = "C:\\ExcelData\\";
            private string m_strNorthwind = "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb";
    
            private void Form1_Load(object sender, System.EventArgs e)
            {			
                comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
    
                comboBox1.Items.AddRange(new object[]{
                                                         "Use Automation to Transfer Data Cell by Cell ", 
                                                         "Use Automation to Transfer an Array of Data to a Range on a Worksheet ", 
                                                         "Use Automation to Transfer an ADO Recordset to a Worksheet Range ", 
                                                         "Use Automation to Create a QueryTable on a Worksheet", 
                                                         "Use the Clipboard", 
                                                         "Create a Delimited Text File that Excel Can Parse into Rows and Columns", 
                                                         "Transfer Data to a Worksheet Using ADO.NET "});
                comboBox1.SelectedIndex = 0;
                button1.Text = "Go!";
            }
    
            private void button1_Click(object sender, System.EventArgs e)
            {
                switch (comboBox1.SelectedIndex)
                {
                    case 0 : Automation_CellByCell(); break;
                    case 1 : Automation_UseArray(); break;
                    case 2 : Automation_ADORecordset(); break;
                    case 3 : Automation_QueryTable(); break;
                    case 4 : Use_Clipboard(); break;
                    case 5 : Create_TextFile(); break;
                    case 6 : Use_ADONET(); break;
                }
    	
                //Clean-up
                m_objFont = null;
                m_objRange = null;
                m_objSheet = null;
                m_objSheets = null;
                m_objBooks = null;
                m_objBook = null;
                m_objExcel = null;
                GC.Collect();
    
            }
    
            private void Automation_CellByCell()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
                // Add data to cells of the first worksheet in the new workbook.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objRange.set_Value(m_objOpt,"Last Name");
                m_objRange = m_objSheet.get_Range("B1", m_objOpt);
                m_objRange.set_Value(m_objOpt,"First Name");
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange.set_Value(m_objOpt,"Doe");
                m_objRange = m_objSheet.get_Range("B2", m_objOpt);
                m_objRange.set_Value(m_objOpt,"John");
    
                // Apply bold to cells A1:B1.
                m_objRange = m_objSheet.get_Range("A1", "B1");
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
                // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
            }
    
            private void Automation_UseArray()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    
                // Create an array for the headers and add it to cells A1:C1.
                object[] objHeaders = {"Order ID", "Amount", "Tax"};
                m_objRange = m_objSheet.get_Range("A1", "C1");
                m_objRange.set_Value(m_objOpt,objHeaders);
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
                // Create an array with 3 columns and 100 rows and add it to
                // the worksheet starting at cell A2.
                object[,] objData = new Object[100,3];
                Random rdm = new Random((int)DateTime.Now.Ticks);
                double nOrderAmt, nTax;
                for(int r=0;r<100;r++)
                {
                    objData[r,0] = "ORD" + r.ToString("0000");
                    nOrderAmt = rdm.Next(1000);
                    objData[r,1] = nOrderAmt.ToString("c");
                    nTax = nOrderAmt*0.07;
                    objData[r,2] = nTax.ToString("c");
                }
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange = m_objRange.get_Resize(100,3);
                m_objRange.set_Value(m_objOpt,"objData");
                
                // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
            }
    
            private void Automation_ADORecordset()
            {
                // Create a Recordset from all the records in the Orders table.
                ADODB.Connection objConn = new ADODB.Connection();
                ADODB._Recordset objRS = null;
                objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    m_strNorthwind + ";", "", "", 0);
                objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
                object objRecAff;
                objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, 
                    (int)ADODB.CommandTypeEnum.adCmdTable);
    
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    
                // Get the Fields collection from the recordset and determine
                // the number of fields (or columns).
                System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
                int nFields = objRS.Fields.Count;
    
                // Create an array for the headers and add it to the
                // worksheet starting at cell A1.
                object[] objHeaders = new object[nFields];
                ADODB.Field objField = null;
                for(int n=0;n<nFields;n++)
                {
                    objFields.MoveNext();
                    objField = (ADODB.Field)objFields.Current;
                    objHeaders[n] = objField.Name;
                }
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objRange = m_objRange.get_Resize(1, nFields);
                m_objRange.set_Value(m_objOpt,objHeaders);
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
                // Transfer the recordset to the worksheet starting at cell A2.
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
    
                // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
                //Close the recordset and connection
                objRS.Close();
                objConn.Close();
    
            }
    
            private void Automation_QueryTable()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
                // Create a QueryTable that starts at cell A1.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objQryTables = m_objSheet.QueryTables;
                m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
                    "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    m_strNorthwind + ";", m_objRange, "Select * From Orders");
                m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
                m_objQryTable.Refresh(false);
    
                // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
            }
    
            private void Use_Clipboard()
            {
                // Copy a string to the clipboard.
                string sData = "FirstName\tLastName\tBirthdate\r\n"  +
                    "Bill\tBrown\t2/5/85\r\n"  +
                    "Joe\tThomas\t1/1/91";
                System.Windows.Forms.Clipboard.SetDataObject(sData);
    
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
                // Paste the data starting at cell A1.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objSheet.Paste(m_objRange, false);
    
                // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
            }
    
            private void Create_TextFile()
            {
                // Connect to the data source.
                System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
                objConn.Open();
    
                // Execute a command to retrieve all records from the Employees  table.
                System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
                    "Select * From Employees", objConn);
                System.Data.OleDb.OleDbDataReader objReader;
                objReader = objCmd.ExecuteReader();
    
    
                // Create the FileStream and StreamWriter object to write 
                // the recordset contents to file.
                System.IO.FileStream fs = new System.IO.FileStream(
                    m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
                System.IO.StreamWriter sw = new System.IO.StreamWriter(
                    fs, System.Text.Encoding.Unicode);
    
                // Write the field names (headers) as the first line in the text file.
                sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
                    "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
                    "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));
    
                // Write the first six columns in the recordset to a text file as
                // tab-delimited.
                while(objReader.Read()) 
                {
                    for(int i=0;i<=5;i++)
                    {
                        if(!objReader.IsDBNull(i))
                        {
                            string s;
                            s = objReader.GetDataTypeName(i);
                            if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
                            {
                                sw.Write(objReader.GetInt32(i).ToString());
                            }
                            else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
                            {
                                sw.Write(objReader.GetDateTime(i).ToString("d"));
                            }
                            else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
                            {
                                sw.Write(objReader.GetString(i));
                            }
                        }
                        if(i<5) sw.Write("\t");
                    }
                    sw.WriteLine(); 
                }
                sw.Flush();	// Write the buffered data to the FileStream.
    
                // Close the FileStream.
                fs.Close();
    
                // Close the reader and the connection.
                objReader.Close();
                objConn.Close(); 
    
                // ==================================================================
                // Optionally, automate Excel to open the text file and save it in the
                // Excel workbook format.
    
                // Open the text file in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, 
                    Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
                    false, true, false, false, false, false, m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
    
                m_objBook = m_objExcel.ActiveWorkbook;
    
                // Save the text file in the typical workbook format and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
            }
    
            private void Use_ADONET()
            {
                // Establish a connection to the data source.
                System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
                    "Book7.xls;Extended Properties=Excel 8.0;");
                objConn.Open();
    
                // Add two records to the table named 'MyTable'.
                System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
                objCmd.Connection = objConn;
                objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                    " values ('Bill', 'Brown')";
    	
                objCmd.ExecuteNonQuery();
                objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                    " values ('Joe', 'Thomas')";
                objCmd.ExecuteNonQuery();
    
    
                // Close the connection.
                objConn.Close(); 
    
            } 
    
    	}  // End Class
    }// End namespace
    					
    Tenha em atenção tem de alterar o código do Visual Studio 2005. Por predefinição, Visual C# adiciona um formulário ao projecto quando cria um projecto de Windows Forms. O formulário é denominado Form1. Os dois ficheiros que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever o código no Form1.cs. O ficheiro Form1.Designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as acções efectuadas arrastando e largando controlos da caixa de ferramentas.

    Para obter mais informações sobre o Windows Forms Designer no Visual C# 2005, visite o seguinte Web site da Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
    Nota Se não instalou o Office na pasta predefinida (C:\Program Files\Microsoft Office), modifique a constante m_strNorthwind do código de exemplo para corresponder ao caminho de instalação para a base de dados Adamastor.mdb.
  8. Adicione o seguinte as directivas de utilizar no Form1.cs:
    	using System.Reflection;
    	using System.Runtime.InteropServices;
    	using Excel = Microsoft.Office.Interop.Excel;
    					
  9. Prima F5 para compilar e executar o exemplo.

REFERÊNCIAS

Para mais informações, visite o seguinte Web site da Microsoft:
Microsoft Office Development with Visual Studio (http://msdn2.microsoft.com/en-us/library/aa188489.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ADO.NET 1.0
Palavras-chave: 
kbmt kbautomation kbhowtomaster KB306023 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 306023  (http://support.microsoft.com/kb/306023/en-us/ )