Transferencia de datos a un libro de Excel mediante Visual C# 2005 o Visual C# .NET

Para obtener una versión de Microsoft Visual Basic 6.0 de este artículo, consulte 247412.

En este artículo paso a paso se describen varios métodos para transferir datos a Microsoft Excel 2002 desde un programa .NET de Microsoft Visual C# 2005 o Microsoft Visual C#. En este artículo también se presentan las ventajas y desventajas de cada método para que pueda seleccionar la solución que mejor se adapte a su situación.

Información general

La técnica que se usa con más frecuencia para transferir datos a un libro de Excel es Automation. Con Automation, puede llamar a métodos y propiedades específicos de las tareas de Excel. La automatización proporciona la mayor flexibilidad para especificar la ubicación de los datos en el libro, dar formato al libro y realizar varias configuraciones en tiempo de ejecución.

Con Automation, puede usar varias técnicas para transferir los datos:

  • Transferir celda de datos por celda.
  • Transferir datos de una matriz a un rango de celdas.
  • Transfiera los datos de un conjunto de registros de ADO a un rango de celdas mediante el método CopyFromRecordset.
  • Cree un objeto QueryTable en una hoja de cálculo de Excel que contenga el resultado de una consulta en un origen de datos ODBC o OLEDB.
  • Transfiera datos al Portapapeles y pegue el contenido del Portapapeles en una hoja de cálculo de Excel.
    También puede usar varios métodos que no requieren necesariamente automatización para transferir datos a Excel. Si ejecuta un programa del lado servidor, este puede ser un buen enfoque para quitar la mayor parte del procesamiento de datos de los clientes.

Para transferir los datos sin Automation, puede usar los siguientes enfoques:

  • Transfiera los datos a un archivo de texto delimitado por tabulaciones o delimitado por comas que Excel pueda analizar posteriormente en celdas de una hoja de cálculo.
  • Transfiera los datos a una hoja de cálculo mediante ADO.NET.
  • Transfiera datos XML a Excel (versión 2002 y 2003) para proporcionar datos con formato y organizados en filas y columnas.

En este artículo se proporciona una explicación y un ejemplo de código para cada una de estas técnicas. La sección "Crear el proyecto completo de Visual C# 2005 o Visual C# .NET", más adelante en este artículo, muestra cómo crear un programa .NET de Visual C# que ejecuta cada técnica.

Técnicas

Uso de Automation para transferir celdas de datos por celda

Con Automation, puede transferir datos a una hoja de cálculo de una celda a la 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();

La transferencia de celdas de datos por celda es un enfoque aceptable si tiene una pequeña cantidad de datos. Tiene la flexibilidad de colocar los datos en cualquier lugar del libro y puede dar formato condicionalmente a las celdas en tiempo de ejecución. Sin embargo, no es una buena idea usar este enfoque si tiene una gran cantidad de datos para transferir a un libro de Excel. Cada objeto Range que adquiera en tiempo de ejecución da como resultado una solicitud de interfaz que significa que las transferencias de datos se transfieren más lentamente. Además, Microsoft Windows 95, Microsoft Windows 98 y Microsoft Windows Millennium Edition (Me) tienen una limitación de 64 kilobytes (KB) en las solicitudes de interfaz. Si tiene más de 64 KB de solicitudes de interfaz, es posible que el servidor de Automation (Excel) deje de responder o que reciba mensajes de error que indiquen poca memoria.

De nuevo, la transferencia de celdas de datos por celda solo es aceptable para pequeñas cantidades de datos. Si debe transferir grandes conjuntos de datos a Excel, considere la posibilidad de usar uno de los otros enfoques que se describen en este artículo para transferir datos de forma masiva.

Para obtener información adicional y para obtener un ejemplo de Automatización de Excel con Visual C# .NET, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

302084 HOWTO: Automatización de Microsoft Excel desde Microsoft Visual C# .NET

Uso de Automation para transferir una matriz de datos a un rango en una hoja de cálculo

Puede transferir una matriz de datos a un intervalo de varias celdas a la 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));
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();

Si transfiere los datos mediante una matriz en lugar de celda por celda, puede obtener una enorme ganancia de rendimiento con una gran cantidad de datos. Considere las siguientes líneas del código mencionado anteriormente que transfieren datos a 300 celdas de la hoja de cálculo:

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

Este código representa dos solicitudes de interfaz: una para el objeto Range que devuelve el método Range y otra para el objeto Range que devuelve el método Resize. Por el contrario, la transferencia de la celda de datos por celda requiere solicitudes de 300 interfaces a objetos Range. Siempre que sea posible, puede beneficiarse de la transferencia masiva de datos y la reducción del número de solicitudes de interfaz que realice.

Para obtener información adicional sobre el uso de matrices para obtener y establecer valores en rangos con Excel Automation, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

302096 HOWTO: Automatizar Excel con Visual C# .NET para rellenar u obtener datos en un rango mediante matrices

Uso de Automation para transferir un conjunto de registros de ADO a un rango de hojas de cálculo

Los modelos de objetos para Excel 2000, Excel 2002 y Excel 2003 proporcionan el método CopyFromRecordset para transferir un conjunto de registros de ADO a un rango de una hoja de cálculo. En el código siguiente se muestra cómo automatizar Excel para transferir el contenido de la tabla Orders en la base de datos de ejemplo Northwind mediante el 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 solo funciona con objetos Recordset de ADO. No se puede usar el conjunto de datos que se crea mediante ADO.NET con el método CopyFromRecordset. Varios ejemplos de las secciones siguientes muestran cómo transferir datos a Excel con ADO.NET.

Uso de Automation para crear un objeto QueryTable en una hoja de cálculo

Un objeto QueryTable representa una tabla que se compila a partir de datos devueltos desde un origen de datos externo. Al automatizar Excel, puede crear una queryTable proporcionando una cadena de conexión a un origen de datos OLE DB o ODBC y una cadena SQL. Excel genera el conjunto de registros e inserta el conjunto de registros en la hoja de cálculo en la ubicación que especifique. Los objetos QueryTable ofrecen las siguientes ventajas sobre el método CopyFromRecordset:

  • Excel controla la creación del conjunto de registros y su ubicación en la hoja de cálculo.
  • Puede guardar la consulta con el objeto QueryTable y actualizarla más adelante para obtener un conjunto de registros actualizado.
  • Cuando se agrega una nueva queryTable a la hoja de cálculo, puede especificar que los datos que ya existen en las celdas de la hoja de cálculo se desplacen para controlar los nuevos datos (para obtener más información, vea la propiedad RefreshStyle).

En el código siguiente se muestra cómo automatizar Excel 2000, Excel 2002 o Excel 2003 para crear una nueva QueryTable en una hoja de cálculo de Excel mediante datos de la base de datos de ejemplo 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();

Uso del Portapapeles de Windows

Puede usar el Portapapeles de Windows para transferir datos a una hoja de cálculo. Para pegar datos en varias celdas de una hoja de cálculo, puede copiar una cadena en la que las columnas están delimitadas por caracteres TAB y las filas están delimitadas por retornos de carro. En el código siguiente se muestra cómo Visual C# .NET puede usar el Portapapeles de Windows para transferir datos a 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();

Crear un archivo de texto delimitado que Excel pueda analizar en filas y columnas

Excel puede abrir archivos delimitados por tabulaciones o comas y analizar correctamente los datos en celdas. Puede usar esta característica cuando desee transferir una gran cantidad de datos a una hoja de cálculo mientras usa poca automatización, si la hubiera. Este puede ser un buen enfoque para un programa cliente-servidor porque el archivo de texto se puede generar en el lado servidor. A continuación, puede abrir el archivo de texto en el cliente, mediante Automation donde sea adecuado.

En el código siguiente se muestra cómo generar un archivo de texto delimitado por tabulaciones a partir de datos que se leen con 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(); 

El código mencionado anteriormente no usa automation. Sin embargo, si lo desea, puede usar Automation para abrir el archivo de texto y guardar el archivo en el formato de libro de Excel, de forma similar a esta:

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

Transferencia de datos a una hoja de cálculo mediante ADO.NET

Puede usar el proveedor OLE DB de Microsoft Jet para agregar registros a una tabla de un libro de Excel existente. Una tabla en Excel es simplemente un rango de celdas; el intervalo puede tener un nombre definido. Normalmente, la primera fila del intervalo contiene los encabezados (o nombres de campo) y todas las filas posteriores del intervalo contienen los registros.

El código siguiente agrega dos registros nuevos a una tabla de Book7.xls. La tabla en este caso es 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();

Al agregar registros con ADO.NET como se muestra en este ejemplo, se mantiene el formato del libro. Cada registro que se agrega a una fila toma el formato de la fila anterior.

Para obtener información adicional sobre el uso de ADO.NET, haga clic en los números de artículo siguientes para ver los artículos de Microsoft Knowledge Base:

306636 CÓMO: Conectarse a una base de datos y ejecutar un comando mediante ADO.NET y Visual C# .NET

314145 CÓMO: Rellenar un objeto DataSet desde una base de datos mediante Visual C# .NET

307587 HOW TO: Update a Database from a DataSet Object by Using Visual C# .NET

Para obtener información adicional sobre el uso del proveedor OLEDB de Jet con orígenes de datos de Excel, haga clic en los números de artículo siguientes para ver los artículos de Microsoft Knowledge Base:

278973 EJEMPLO: ExcelADO muestra cómo usar ADO para leer y escribir datos en libros de Excel

257819 HOWTO: Uso de ADO con datos de Excel de Visual Basic o VBA

Transferencia de datos XML (Excel 2002 y Excel 2003)

Excel 2002 y 2003 pueden abrir cualquier archivo XML que esté bien formado. Puede abrir archivos XML directamente mediante el comando Abrir del menú Archivo o mediante programación mediante los métodos Open o OpenXML de la colección Workbooks. Si crea archivos XML para usarlos en Excel, también puede crear hojas de estilos para dar formato a los datos.

Creación del proyecto .NET de Visual C# de ejemplo completo

  1. Cree una carpeta denominada C:\ExcelData. El programa de ejemplo almacenará los libros de Excel en esta carpeta.

  2. Cree un nuevo libro para que el ejemplo escriba en:

    1. Inicie un nuevo libro en Excel.
    2. En Sheet1 del nuevo libro, escriba FirstName en la celda A1 y LastName en la celda B1.
    3. Seleccione A1:B1.
    4. En el menú Insertar, seleccione Nombre y, a continuación, haga clic en Definir. Escriba el nombre MyTable y haga clic en Aceptar.
    5. Guarde el libro como C:\Exceldata\Book7.xls.
    6. Salga de Excel.
  3. Inicie Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET. En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto. En Proyectos de Visual C# o Visual C#, seleccione Aplicación windows. De forma predeterminada, se crea Form1.

  4. Agregue una referencia a la biblioteca de objetos de Excel y al ensamblado de interoperabilidad principal de ADODB. Para ello, siga estos pasos:

    1. On the Project menu, click Add Reference.
    2. En la pestaña NET, busque ADODB y, a continuación, haga clic en Seleccionar.

    Nota En Visual Studio 2005, no es necesario hacer clic en Seleccionar.
    3. En la pestaña COM, busque Biblioteca de objetos de Microsoft Excel 10.0 o Biblioteca de objetos de Microsoft Excel 11.0 y haga clic en Seleccionar.

    Nota En Visual Studio 2005, no es necesario hacer clic en Seleccionar.

    Nota Si usa Microsoft Excel 2002 y aún no lo ha hecho, Microsoft recomienda descargar e instalar los ensamblados de interoperabilidad primarios (PIA) de Microsoft Office XP.

  5. En el cuadro de diálogo Agregar referencias, haga clic en Aceptar para aceptar las selecciones.

  6. Agregue un control Cuadro combinado y un control Botón a Form1.

  7. Agregue controladores de eventos para el evento Form Load y los eventos Click del control Button:

    1. En la vista de diseño de Form1.cs, haga doble clic en Form1.

    El controlador del evento Load del formulario se crea y aparece en Form1.cs.
    2. En el menú Ver, haga clic en Diseñador para cambiar a la vista de diseño.
    3. Haga doble clic en Button1.

    El controlador del evento Click del botón se crea y aparece en Form1.cs.

  8. En Form1.cs, reemplace el código siguiente:

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

    con:

            // 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 Debe cambiar el código en Visual Studio 2005. De forma predeterminada, Visual C# agrega un formulario al proyecto al crear un proyecto de Windows Forms. El formulario se denomina Form1. Los dos archivos que representan el formulario se denominan Form1.cs y Form1.designer.cs. El código se escribe en Form1.cs. El archivo Form1.designer.cs es donde el diseñador de Windows Forms escribe el código que implementa todas las acciones que ha realizado arrastrando y quitando controles desde el cuadro de herramientas.

    Para obtener más información sobre el Diseñador de Windows Forms en Visual C# 2005, visite el siguiente sitio web de Microsoft Developer Network (MSDN):

    Creación de un proyecto (Visual C#) Nota Si no ha instalado Office en la carpeta predeterminada (C:\Archivos de programa\Microsoft Office), modifique la constante m_strNorthwind en el ejemplo de código para que coincida con la ruta de instalación de Northwind.mdb.

  9. Agregue lo siguiente a las directivas Using de Form1.cs:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Pulse F5 para compilar y ejecutar el ejemplo.

Referencias

Para obtener más información, visite el siguiente sitio web de Microsoft:

Desarrollo de Microsoft Office con Visual Studio