Comment automatiser Excel à l’aide de Visual C# pour remplir ou obtenir des données dans une plage à l’aide de tableaux

Résumé

Cet article montre comment automatiser Microsoft Excel à l’aide de Microsoft Visual C# 2005 ou Microsoft Visual C# .NET pour remplir et récupérer des valeurs dans une plage à plusieurs cellules à l’aide de tableaux.

Informations supplémentaires

Pour remplir une plage à plusieurs cellules sans remplir les cellules une par une, vous pouvez définir la propriété Value d’un objet Range sur un tableau à deux dimensions. De même, vous pouvez récupérer un tableau à deux dimensions de valeurs pour plusieurs cellules à la fois à l’aide de la propriété Value. Les étapes suivantes illustrent ce processus pour définir et récupérer des données à l’aide de tableaux à deux dimensions.

Créer le client Automation pour Microsoft Excel

  1. Démarrez Microsoft Visual Studio 2005 ou Microsoft Visual Studio .NET.

  2. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sélectionnez Application Windows dans les types de projet Visual C#. Form1 est créé par défaut.

  3. Ajoutez une référence à la bibliothèque d’objets Microsoft Excel 11.0 dans Visual Studio 2005 ou à la bibliothèque d’objets Microsoft Excel dans Visual Studio .NET. Pour cela, procédez comme suit :

    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Sous l’onglet COM, recherchez la bibliothèque d’objets Microsoft Excel, puis cliquez sur Sélectionner.

    Dans Visual Studio 2005, recherchez la bibliothèque d’objets Microsoft Excel 11.0 sous l’onglet COM .

    Note Microsoft Office 2003 inclut des assemblys PIA (Primary Interop Assemblies). Microsoft Office XP n’inclut pas de codes confidentiels, mais ils peuvent être téléchargés.

  4. Cliquez sur OK dans la boîte de dialogue Ajouter des références pour accepter vos sélections. Si vous êtes invité à générer des wrappers pour les bibliothèques que vous avez sélectionnées, cliquez sur Oui.

  5. Dans le menu Affichage, sélectionnez Boîte à outils pour afficher la boîte à outils. Ajoutez deux boutons et une case à cocher à Form1.

  6. Définissez les propriétés Nom et Texte de la case à cocher sur FillWithStrings.

  7. Double-cliquez sur Button1. La fenêtre de code du formulaire s’affiche.

  8. Dans la fenêtre de code, remplacez le code suivant :

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

    avec :

       //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" );
          }
       }
    

    Note Vous devez modifier le code dans Visual Studio 2005. Par défaut, Visual C# ajoute un formulaire au projet lorsque vous créez un projet Windows Forms. Le formulaire est nommé Form1. Les deux fichiers qui représentent le formulaire sont nommés Form1.cs et Form1.designer.cs. Vous écrivez le code dans Form1.cs. Le fichier Form1.designer.cs est l’endroit où le concepteur Windows Forms écrit le code qui implémente toutes les actions que vous avez effectuées en faisant glisser et en supprimant des contrôles de la boîte à outils.

    Pour plus d’informations sur le concepteur Windows Forms dans Visual C# 2005, visitez le site web Microsoft Developer Network (MSDN) suivant :

    Création d’un projet (Visual C#)

  9. Revenez en mode Création pour Form1, puis double-cliquez sur Button2.

  10. Dans la fenêtre de code, remplacez le code suivant :

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

avec :

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. Faites défiler jusqu’en haut de la fenêtre de code. Ajoutez la ligne suivante à la fin de la liste des directives using :

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

Tester le client Automation

  1. Appuyez sur F5 pour générer et exécuter l’exemple de programme.
  2. Cliquez sur Bouton1. Le programme démarre Microsoft Excel avec un nouveau classeur et remplit les cellules A1:E5 de la première feuille de calcul avec des données numériques d’un tableau.
  3. Cliquez sur Button2. Le programme récupère les données des cellules A1:E5 dans un nouveau tableau et affiche les résultats dans une boîte de message.
  4. Sélectionnez FillWithStrings, puis cliquez sur Button1 pour remplir les cellules A1:E5 avec des données de chaîne.

References

Pour plus d’informations, visitez le site web Microsoft Developer Network (MSDN) suivant :

Développement Microsoft Office avec Visual Studio