Comment accéder aux objets d’interopérabilité Office

C# offre des fonctionnalités qui simplifient l’accès aux objets d’API Office. Les nouvelles fonctionnalités incluent les arguments nommés et les arguments facultatifs, un nouveau type appelé dynamic et la possibilité de passer des arguments aux paramètres de référence dans les méthodes COM comme s'il s'agissait de paramètres de valeur.

Dans cet article, vous utilisez les nouvelles fonctionnalités pour écrire le code qui crée et affiche une feuille de calcul Microsoft Office Excel. Vous écrivez le code pour ajouter un document Office Word qui contient une icône liée à la feuille de calcul Excel.

Pour effectuer cette procédure pas à pas, Microsoft Office Excel 2007 et Microsoft Office Word 2007, ou versions ultérieures, doivent être installés sur votre ordinateur.

Notes

Il est possible que pour certains des éléments de l'interface utilisateur de Visual Studio, votre ordinateur affiche des noms ou des emplacements différents de ceux indiqués dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d’informations, consultez Personnalisation de l’IDE.

Important

VSTO (Visual Studio Tools pour Office) s’appuie sur .NET Framework. Les compléments COM peuvent également être écrits avec .NET Framework. Les compléments Office ne peuvent pas être créés avec .NET Core et .NET 5+, les dernières versions de .NET. En effet, .NET Core et .NET 5+ ne peuvent pas fonctionner avec .NET Framework dans le même processus, et cela peut entraîner des échecs de chargement des compléments. Vous pouvez continuer d’utiliser .NET Framework pour écrire des compléments VSTO et COM pour Office. Microsoft ne mettra pas à jour VSTO ou la plateforme de compléments COM pour utiliser .NET Core ou .NET 5+. Vous pouvez utiliser .NET Core et .NET 5+, dont ASP.NET Core, pour créer le côté serveur des compléments web Office.

Pour créer une application console

  1. Démarrez Visual Studio.
  2. Dans le menu Fichier , pointez sur Nouveau, puis sélectionnez Projet. La boîte de dialogue Nouveau projet apparaît.
  3. Dans le volet Modèles installés, développez C#, puis sélectionnez Windows.
  4. Vérifiez en haut de la boîte de dialogue Nouveau projet que vous avez sélectionné .NET Framework 4 (ou version ultérieure) comme version cible de .NET Framework.
  5. Dans le volet Modèles, sélectionnez Application console.
  6. Attribuez un nom à votre projet dans le champ Nom.
  7. Sélectionnez OK.

Le nouveau projet s’affiche dans l’Explorateur de solutions.

Pour ajouter des références

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nom de votre projet, puis sélectionnez Ajouter une référence. La boîte de dialogue Ajouter une référence s’affiche.
  2. Dans la page Assemblys, sélectionnez Microsoft.Office.Interop.Word dans la liste Nom du composant, puis maintenez la touche CTRL enfoncée et sélectionnez Microsoft.Office.Interop.Excel. Si vous ne voyez pas les assemblys, vous devrez peut-être les installer. Consultez Guide pratique pour installer des assemblys d’interopérabilité principaux Office.
  3. Sélectionnez OK.

Pour ajouter les directives using nécessaires

Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le fichier Program.cs, puis sélectionnez Afficher le code. Ajoutez les directives using suivantes en début du fichier de code :

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

Pour créer une liste de comptes bancaires

Copiez-collez la définition de classe suivante dans Program.cs, sous la classe Program.

public class Account
{
    public int ID { get; set; }
    public double Balance { get; set; }
}

Ajoutez le code suivant à la méthode Main pour créer une liste bankAccounts contenant deux comptes.

// Create a list of accounts.
var bankAccounts = new List<Account> {
    new Account {
                  ID = 345678,
                  Balance = 541.27
                },
    new Account {
                  ID = 1230221,
                  Balance = -127.44
                }
};

Pour déclarer une méthode qui exporte les informations de compte vers Excel

  1. Ajoutez la méthode suivante à la classe Program pour définir une feuille de calcul Excel. La méthode Add a un paramètre facultatif pour spécifier un modèle particulier. Les paramètres facultatifs vous permettent d’omettre l’argument du paramètre, si vous souhaitez utiliser la valeur par défaut de ce dernier. Comme vous n’avez pas fourni d’argument, Add utilise le modèle par défaut et crée un classeur. L'instruction équivalente dans les versions antérieures de C# nécessite un argument d'espace réservé : ExcelApp.Workbooks.Add(Type.Missing).
static void DisplayInExcel(IEnumerable<Account> accounts)
{
    var excelApp = new Excel.Application();
    // Make the object visible.
    excelApp.Visible = true;

    // Create a new, empty workbook and add it to the collection returned
    // by property Workbooks. The new workbook becomes the active workbook.
    // Add has an optional parameter for specifying a particular template.
    // Because no argument is sent in this example, Add creates a new workbook.
    excelApp.Workbooks.Add();

    // This example uses a single workSheet. The explicit type casting is
    // removed in a later procedure.
    Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
}

À la fin de DisplayInExcel, ajoutez le code suivant. Le code insère les valeurs dans les deux premières colonnes de la première ligne de la feuille de calcul.

// Establish column headings in cells A1 and B1.
workSheet.Cells[1, "A"] = "ID Number";
workSheet.Cells[1, "B"] = "Current Balance";

À la fin de DisplayInExcel, ajoutez le code suivant. La boucle foreach place les informations de la liste des comptes dans les deux premières colonnes des lignes successives de la feuille de calcul.


var row = 1;
foreach (var acct in accounts)
{
    row++;
    workSheet.Cells[row, "A"] = acct.ID;
    workSheet.Cells[row, "B"] = acct.Balance;
}

À la fin de DisplayInExcel, ajoutez le code suivant pour ajuster les largeurs de colonne au contenu.

workSheet.Columns[1].AutoFit();
workSheet.Columns[2].AutoFit();

Les versions antérieures de C# nécessitent un cast explicite pour ces opérations, car ExcelApp.Columns[1] retourne Object, et AutoFit est une méthode Range d’Excel. Les lignes suivantes illustrent le cast.

((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();

C# convertit automatiquement l’Object retourné en dynamic si l’assembly est référencé par l’option du compilateur EmbedInteropTypes ou si la propriété Excel Incorporer les types interop a la valeur true. La valeur par défaut de cette propriété est true.

Pour exécuter le projet

À la fin de Main, ajoutez la ligne suivante.

// Display the list in an Excel spreadsheet.
DisplayInExcel(bankAccounts);

Appuyez sur CTRL+F5. Une feuille de calcul Excel s'affiche avec les données des deux comptes.

Pour ajouter un document Word

Le code suivant ouvre une application Word et crée une icône pointant vers la feuille de calcul Excel. Collez la méthode CreateIconInWordDoc, fournie ultérieurement dans cette étape, dans la classe Program. CreateIconInWordDoc utilise des arguments nommés et facultatifs pour réduire la complexité des appels de méthode à Add et PasteSpecial. Ces appels incorporent deux autres fonctionnalités qui simplifient les appels aux méthodes COM comportant des paramètres de référence. Premièrement, vous pouvez envoyer des arguments aux paramètres de référence comme s'il s'agissait de paramètres de valeur. Autrement dit, vous pouvez envoyer les valeurs directement, sans créer une variable pour chaque paramètre de référence. Le compilateur génère des variables temporaires pour stocker les valeurs d'argument et les ignore lors du retour de l'appel. Ensuite, vous pouvez omettre le mot clé ref dans la liste d'arguments.

La méthode Add comporte quatre paramètres de référence, tous facultatifs. Vous pouvez omettre les arguments de tout ou partie des paramètres si vous voulez utiliser leur valeur par défaut.

La méthode PasteSpecial insère le contenu du Presse-papiers. La méthode comporte sept paramètres de référence, tous facultatifs. Le code suivant spécifie des arguments pour deux d'entre eux : Link pour créer un lien vers la source du contenu du Presse-papiers et DisplayAsIcon pour afficher le lien sous forme d'icône. Vous pouvez utiliser des arguments nommés pour ces deux-là et omettre les autres. Bien que ces arguments constituent des paramètres de référence, vous n'avez pas à utiliser le mot clé ref ou à créer des variables à envoyer tant qu'arguments. Vous pouvez envoyer les valeurs directement.

static void CreateIconInWordDoc()
{
    var wordApp = new Word.Application();
    wordApp.Visible = true;

    // The Add method has four reference parameters, all of which are
    // optional. Visual C# allows you to omit arguments for them if
    // the default values are what you want.
    wordApp.Documents.Add();

    // PasteSpecial has seven reference parameters, all of which are
    // optional. This example uses named arguments to specify values
    // for two of the parameters. Although these are reference
    // parameters, you do not need to use the ref keyword, or to create
    // variables to send in as arguments. You can send the values directly.
    wordApp.Selection.PasteSpecial( Link: true, DisplayAsIcon: true);
}

À la fin de Main, ajoutez l'instruction suivante.

// Create a Word document that contains an icon that links to
// the spreadsheet.
CreateIconInWordDoc();

À la fin de DisplayInExcel, ajoutez l'instruction suivante. La méthode Copy ajoute la feuille de calcul au Presse-papiers.

// Put the spreadsheet contents on the clipboard. The Copy method has one
// optional parameter for specifying a destination. Because no argument
// is sent, the destination is the Clipboard.
workSheet.Range["A1:B3"].Copy();

Appuyez sur CTRL+F5. Un document Word s'affiche avec une icône. Double-cliquez sur l'icône pour afficher la feuille de calcul au premier plan.

Pour définir la propriété Incorporer les types interop

D'autres améliorations sont possibles lorsque vous appelez un type COM qui ne nécessite pas un assembly PIA (Primary Interop Assembly) au moment de l'exécution. La suppression de la dépendance vis-à-vis des assemblys PIA aboutit à l'indépendance des versions et facilite le déploiement. Pour plus d’informations sur les avantages de la programmation sans assemblys PIA, consultez Procédure pas à pas : incorporation de types provenant d’assemblys managés.

En outre, la programmation est plus facile, car le type dynamic représente les types requis et retournés déclarés dans les méthodes COM. Les variables de type dynamic ne sont pas évaluées avant l'exécution, ce qui élimine la nécessité d'un cast explicite. Pour plus d’informations, consultez Utilisation du type dynamic.

L'incorporation des informations de type au lieu de l'utilisation des assemblys PIA est le comportement par défaut. En raison de ce comportement par défaut, plusieurs des exemples précédents sont simplifiés. Aucun cast explicite n'est requis. Par exemple, la déclaration de worksheet dans DisplayInExcel est écrite sous la forme Excel._Worksheet workSheet = excelApp.ActiveSheet plutôt que sous la forme Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet. Les appels à AutoFit dans la même méthode nécessiteraient également un cast explicite sans la valeur par défaut, parce que ExcelApp.Columns[1] retourne un Object et que AutoFit est une méthode Excel. Le code suivant illustre le cast.

((Excel.Range)workSheet.Columns[1]).AutoFit();
((Excel.Range)workSheet.Columns[2]).AutoFit();

Pour modifier la valeur par défaut et utiliser les assemblys PIA au lieu d’incorporer les informations de type, développez le nœud Références dans l’Explorateur de solutions, puis sélectionnez Microsoft.Office.Interop.Excel ou Microsoft.Office.Interop.Word. Si la fenêtre Propriétés n’apparaît pas, appuyez sur F4. Recherchez Incorporer les types interop dans la liste des propriétés et attribuez-lui la valeur False. Vous pouvez aussi compiler à l’aide de l’option du compilateur References au lieu de l’option EmbedInteropTypes à l’invite de commandes.

Pour ajouter une mise en forme supplémentaire au tableau

Remplacez les deux appels à AutoFit de DisplayInExcel avec l'instruction suivante.

// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(
    Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

La méthode AutoFormat a sept paramètres de valeur, tous facultatifs. Les arguments nommés et les arguments facultatifs vous permettent de fournir des arguments pour tout ou partie des paramètres, voire pour aucun. Dans l'instruction précédente, vous fournissez un argument pour un seul des paramètres, Format. Comme Format est le premier paramètre dans la liste des paramètres, vous n'avez pas à fournir le nom du paramètre. Cependant, l'instruction peut être plus facile à comprendre si vous incluez le nom du paramètre, comme illustré dans le code suivant.

// Call to AutoFormat in Visual C# 2010.
workSheet.Range["A1", "B3"].AutoFormat(Format:
    Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

Appuyez sur CTRL+F5 pour afficher le résultat. Vous trouverez d’autres formats dans l’énumération XlRangeAutoFormat.

Exemple

L'exemple de code suivant illustre l'exemple complet.

using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

namespace OfficeProgrammingWalkthruComplete
{
    class Walkthrough
    {
        static void Main(string[] args)
        {
            // Create a list of accounts.
            var bankAccounts = new List<Account>
            {
                new Account {
                              ID = 345678,
                              Balance = 541.27
                            },
                new Account {
                              ID = 1230221,
                              Balance = -127.44
                            }
            };

            // Display the list in an Excel spreadsheet.
            DisplayInExcel(bankAccounts);

            // Create a Word document that contains an icon that links to
            // the spreadsheet.
            CreateIconInWordDoc();
        }

        static void DisplayInExcel(IEnumerable<Account> accounts)
        {
            var excelApp = new Excel.Application();
            // Make the object visible.
            excelApp.Visible = true;

            // Create a new, empty workbook and add it to the collection returned
            // by property Workbooks. The new workbook becomes the active workbook.
            // Add has an optional parameter for specifying a particular template.
            // Because no argument is sent in this example, Add creates a new workbook.
            excelApp.Workbooks.Add();

            // This example uses a single workSheet.
            Excel._Worksheet workSheet = excelApp.ActiveSheet;

            // Earlier versions of C# require explicit casting.
            //Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;

            // Establish column headings in cells A1 and B1.
            workSheet.Cells[1, "A"] = "ID Number";
            workSheet.Cells[1, "B"] = "Current Balance";

            var row = 1;
            foreach (var acct in accounts)
            {
                row++;
                workSheet.Cells[row, "A"] = acct.ID;
                workSheet.Cells[row, "B"] = acct.Balance;
            }

            workSheet.Columns[1].AutoFit();
            workSheet.Columns[2].AutoFit();

            // Call to AutoFormat in Visual C#. This statement replaces the
            // two calls to AutoFit.
            workSheet.Range["A1", "B3"].AutoFormat(
                Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);

            // Put the spreadsheet contents on the clipboard. The Copy method has one
            // optional parameter for specifying a destination. Because no argument
            // is sent, the destination is the Clipboard.
            workSheet.Range["A1:B3"].Copy();
        }

        static void CreateIconInWordDoc()
        {
            var wordApp = new Word.Application();
            wordApp.Visible = true;

            // The Add method has four reference parameters, all of which are
            // optional. Visual C# allows you to omit arguments for them if
            // the default values are what you want.
            wordApp.Documents.Add();

            // PasteSpecial has seven reference parameters, all of which are
            // optional. This example uses named arguments to specify values
            // for two of the parameters. Although these are reference
            // parameters, you do not need to use the ref keyword, or to create
            // variables to send in as arguments. You can send the values directly.
            wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
        }
    }

    public class Account
    {
        public int ID { get; set; }
        public double Balance { get; set; }
    }
}

Voir aussi