Cómo automatizar Excel mediante Visual C# para rellenar u obtener datos en un rango mediante matrices

Resumen

En este artículo se muestra cómo automatizar Microsoft Excel mediante Microsoft Visual C# 2005 o Microsoft Visual C# .NET para rellenar y recuperar valores en un intervalo de varias celdas mediante matrices.

Más información

Para rellenar un rango de varias celdas sin rellenar celdas de una en una, puede establecer la propiedad Value de un objeto Range en una matriz bidimensional. Del mismo modo, puede recuperar una matriz bidimensional de valores para varias celdas a la vez mediante la propiedad Value. En los pasos siguientes se muestra este proceso para establecer y recuperar datos mediante matrices bidimensionales.

Compilación del cliente de Automation para Microsoft Excel

  1. Inicie Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET.

  2. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto. Seleccione Aplicación windows en Los tipos de proyecto de Visual C#. Form1 se crea de forma predeterminada.

  3. Agregue una referencia a la biblioteca de objetos de Microsoft Excel 11.0 en Visual Studio 2005 o a la biblioteca de objetos de Microsoft Excel en Visual Studio .NET. Para ello, siga estos pasos:

    1. On the Project menu, click Add Reference.
    2. En la pestaña COM, busque Biblioteca de objetos de Microsoft Excel y, a continuación, haga clic en Seleccionar.

    En Visual Studio 2005, busque Biblioteca de objetos de Microsoft Excel 11.0 en la pestaña COM .

    Nota Microsoft Office 2003 incluye ensamblados de interoperabilidad primarios (PIA). Microsoft Office XP no incluye los PIA, pero se pueden descargar.

  4. Haga clic en Aceptar en el cuadro de diálogo Agregar referencias para aceptar las selecciones. Si se le pide que genere contenedores para las bibliotecas que seleccionó, haga clic en Sí.

  5. En el menú Ver, seleccione Cuadro de herramientas para mostrar el cuadro de herramientas. Agregue dos botones y una casilla a Form1.

  6. Establezca las propiedades Name y Text de la casilla en FillWithStrings.

  7. Haga doble clic en Button1. Aparece la ventana de código del formulario.

  8. En la ventana de código, reemplace el código siguiente:

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

    con:

       //Declare these two variables globally so you can access them from both
       //Button1 and Button2.
       Excel.Application objApp;
       Excel._Workbook objBook;
    
    private void button1_Click(object sender, System.EventArgs e)
       {
          Excel.Workbooks objBooks;
          Excel.Sheets objSheets;
          Excel._Worksheet objSheet;
          Excel.Range range;
    
    try
          {
             // Instantiate Excel and start a new workbook.
             objApp = new Excel.Application();
             objBooks = objApp.Workbooks;
             objBook = objBooks.Add( Missing.Value );
             objSheets = objBook.Worksheets;
             objSheet = (Excel._Worksheet)objSheets.get_Item(1);
    
    //Get the range where the starting cell has the address
             //m_sStartingCell and its dimensions are m_iNumRows x m_iNumCols.
             range = objSheet.get_Range("A1", Missing.Value);
             range = range.get_Resize(5, 5);
    
    if (this.FillWithStrings.Checked == false)
             {
                //Create an array.
                double[,] saRet = new double[5, 5];
    
    //Fill the array.
                for (long iRow = 0; iRow < 5; iRow++)
                {
                   for (long iCol = 0; iCol < 5; iCol++)
                   {
                      //Put a counter in the cell.
                      saRet[iRow, iCol] = iRow * iCol;
                   }
                }
    
    //Set the range value to the array.
                range.set_Value(Missing.Value, saRet );
             }
    
    else
             {
                //Create an array.
                string[,] saRet = new string[5, 5];
    
    //Fill the array.
                for (long iRow = 0; iRow < 5; iRow++)
                {
                   for (long iCol = 0; iCol < 5; iCol++)
                   {
                      //Put the row and column address in the cell.
                      saRet[iRow, iCol] = iRow.ToString() + "|" + iCol.ToString();
                   }
                }
    
    //Set the range value to the array.
                range.set_Value(Missing.Value, saRet );
             }
    
    //Return control of Excel to the user.
             objApp.Visible = true;
             objApp.UserControl = true;
          }
          catch( Exception theException ) 
          {
             String errorMessage;
             errorMessage = "Error: ";
             errorMessage = String.Concat( errorMessage, theException.Message );
             errorMessage = String.Concat( errorMessage, " Line: " );
             errorMessage = String.Concat( errorMessage, theException.Source );
    
    MessageBox.Show( errorMessage, "Error" );
          }
       }
    

    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#)

  9. Vuelva a la vista de diseño de Form1 y haga doble clic en Button2.

  10. En la ventana de código, reemplace el código siguiente:

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

con:

private void button2_Click(object sender, System.EventArgs e)
   {
      Excel.Sheets objSheets;
      Excel._Worksheet objSheet;
      Excel.Range range;

try
      {
         try
         {
            //Get a reference to the first sheet of the workbook.
            objSheets = objBook.Worksheets;
            objSheet = (Excel._Worksheet)objSheets.get_Item(1);
         }

catch( Exception theException ) 
         {
            String errorMessage;
            errorMessage = "Can't find the Excel workbook.  Try clicking Button1 " +
               "to create an Excel workbook with data before running Button2.";

MessageBox.Show( errorMessage, "Missing Workbook?");

//You can't automate Excel if you can't find the data you created, so 
            //leave the subroutine.
            return;
         }

//Get a range of data.
         range = objSheet.get_Range("A1", "E5");

//Retrieve the data from the range.
         Object[,] saRet;
         saRet = (System.Object[,])range.get_Value( Missing.Value );

//Determine the dimensions of the array.
         long iRows;
         long iCols;
         iRows = saRet.GetUpperBound(0);
         iCols = saRet.GetUpperBound(1);

//Build a string that contains the data of the array.
         String valueString;
         valueString = "Array Data\n";

for (long rowCounter = 1; rowCounter <= iRows; rowCounter++)
         {
            for (long colCounter = 1; colCounter <= iCols; colCounter++)
            {

//Write the next value into the string.
               valueString = String.Concat(valueString,
                  saRet[rowCounter, colCounter].ToString() + ", ");
            }

//Write in a new line.
            valueString = String.Concat(valueString, "\n");
         }

//Report the value of the array.
         MessageBox.Show(valueString, "Array Values");
      }

catch( Exception theException ) 
      {
         String errorMessage;
         errorMessage = "Error: ";
         errorMessage = String.Concat( errorMessage, theException.Message );
         errorMessage = String.Concat( errorMessage, " Line: " );
         errorMessage = String.Concat( errorMessage, theException.Source );

MessageBox.Show( errorMessage, "Error" );
      }
   }
  1. Desplácese hasta la parte superior de la ventana de código. Agregue la siguiente línea al final de la lista de directivas using:

    using System.Reflection; 
    using Excel =  Microsoft.Office.Interop.Excel;
    

Prueba del cliente de Automation

  1. Presione F5 para compilar y ejecutar el programa de ejemplo.
  2. Haga clic en Botón1. El programa inicia Microsoft Excel con un nuevo libro y rellena las celdas A1:E5 de la primera hoja de cálculo con datos numéricos de una matriz.
  3. Haga clic en Botón2. El programa recupera los datos de las celdas A1:E5 en una nueva matriz y muestra los resultados en un cuadro de mensaje.
  4. Seleccione FillWithStrings y, a continuación, haga clic en Button1 para rellenar las celdas A1:E5 con datos de cadena.

Referencias

Para obtener más información, visite el siguiente sitio web de Microsoft Developer Network (MSDN):

Desarrollo de Microsoft Office con Visual Studio