Comment : accéder aux objets Office Interop à l'aide des fonctionnalités Visual C# 2010 (Guide de programmation C#)
Visual C# 2010 introduit de nouvelles fonctionnalités qui simplifient l'accès aux objets d'API Office.Les nouvelles fonctionnalités incluent des arguments nommés et 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 cette rubrique, vous utiliserez les nouvelles fonctionnalités pour écrire du code permettant de créer et d'afficher une feuille de calcul Microsoft Office Excel.Vous écrirez ensuite du code pour ajouter un document Office Word qui contient une icône liée à la feuille de calcul Excel.
Pour exécuter cette procédure pas à pas, vous devez avoir installé Microsoft Office Excel 2007 et Microsoft Office Word 2007 sur votre ordinateur.
Si vous utilisez un système d'exploitation plus ancien que Windows Vista, vérifiez que le .NET Framework 2.0 est installé.
[!REMARQUE]
Il est possible que votre ordinateur affiche des noms ou des emplacements différents pour certains des éléments d'interface utilisateur de Visual Studio 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 Paramètres Visual Studio.
Pour créer une application console
Démarrez Visual Studio.
Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.La boîte de dialogue Nouveau projet s'affiche.
Dans le volet Modèles installés, développez Visual C#, puis cliquez sur Windows.
En haut de la boîte de dialogue Nouveau projet, vérifiez que .NET Framework 4 est sélectionné comme Framework cible.
Dans le volet Modèles, cliquez sur Application console.
Tapez un nom pour votre projet dans le champ Nom.
Cliquez sur OK.
Le nouveau projet s'affiche dans l'Explorateur de solutions.
Pour ajouter des références
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, puis cliquez sur Ajouter une référence.La boîte de dialogue Ajouter une référence s'affiche.
Dans la page .NET, 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.
Cliquez sur OK.
Pour ajouter les directives using nécessaires
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier Program.cs, puis cliquez sur Afficher le code.
Ajoutez les directives using suivantes au 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
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 qui contient 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 permettant d'exporter les informations sur les comptes vers Excel
Ajoutez la méthode suivante à la classe Program pour configurer une feuille de calcul Excel.
La méthode Add comporte un paramètre optionnel permettant de spécifier un modèle particulier.Les paramètres optionnels, qui sont des nouveautés de Visual C# 2010, vous permettent d'omettre l'argument qui leur est associé si vous voulez utiliser leur valeur par défaut.Étant donné qu'aucun argument n'est envoyé dans le code suivant, Add utilise le modèle par défaut et crée un classeur.L'instruction équivalente des versions antérieures de C# requiert 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 praticular 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; }
Ajoutez le code suivant à la fin de DisplayInExcel.Le code insère des 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";
Ajoutez le code suivant à la fin de DisplayInExcel.La boucle foreach place les informations de la liste de comptes dans les deux premières colonnes de 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; }
Ajoutez le code suivant à la fin de DisplayInExcel pour ajuster les largeurs de colonne en fonction du contenu.
workSheet.Columns[1].AutoFit(); workSheet.Columns[2].AutoFit();
Les versions antérieures de C# requièrent un cast explicite pour ces opérations car ExcelApp.Columns[1] retourne un Object et AutoFit est une méthode Range Excel.Les lignes suivantes représentent l'opération de cast.
((Excel.Range)workSheet.Columns[1]).AutoFit(); ((Excel.Range)workSheet.Columns[2]).AutoFit();
Visual C# 2010 convertit automatiquement l'élément Object retourné en type dynamic si l'assembly est référencé par l'option de compilateur /link ou, de façon équivalente, si la propriété Incorporer les types d'interopérabilité Excel a la valeur true.True est la valeur par défaut de cette propriété.
Pour exécuter le projet.
Ajoutez la ligne suivante à la fin de Main.
// Display the list in an Excel spreadsheet. DisplayInExcel(bankAccounts);
Appuyez sur la combinaison de touches CTRL+F5.
Une feuille de calcul Excel contenant les données des deux comptes s'affiche.
Pour ajouter un document Word
Pour illustrer d'autres améliorations apportées par Visual C# 2010 à la programmation Office, le code suivant ouvre une application Word et crée une icône liée à 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 vers Add et PasteSpecial.Ces appels incorporent deux autres nouvelles fonctionnalités de Visual C# 2010 qui simplifient les appels aux méthodes COM comportant des paramètres de référence.Vous pouvez d'abord envoyer des arguments aux paramètres de référence comme s'il s'agissait de paramètres de valeur.En d'autres termes, vous pouvez envoyer directement des valeurs, sans créer de 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.Vous pouvez ensuite omettre le mot clé ref dans la liste d'arguments.
La méthode Add comporte quatre paramètres de référence, qui sont tous optionnels.En Visual C# 2010, vous pouvez omettre les arguments de tous les paramètres ou de certains d'entre eux si vous voulez utiliser leur valeur par défaut.Dans Visual C# 2008 et les versions antérieures, un argument doit être fourni pour chaque paramètre et correspondre à une variable car les paramètres sont des paramètres de référence.
La méthode PasteSpecial insère le contenu du Presse-papiers.La méthode comporte sept paramètres de référence, qui sont tous optionnels.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.En Visual C# 2010, vous pouvez utiliser les arguments nommés pour ces deux paramètres et omettre les autres.Bien qu'il s'agisse de paramètres de référence, il n'est pas nécessaire d'utiliser le mot clé ref ou de créer des variables à envoyer en tant qu'arguments.Vous pouvez envoyer directement les valeurs.Dans Visual C# 2008 et les versions antérieures, vous devez envoyer un argument de variable pour chaque paramètre de référence.
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# 2010 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); }
Dans Visual C# 2008 ou les versions antérieures du langage, le code suivant, plus complexe, est requis.
static void CreateIconInWordDoc2008() { var wordApp = new Word.Application(); wordApp.Visible = true; // The Add method has four parameters, all of which are optional. // In Visual C# 2008 and earlier versions, an argument has to be sent // for every parameter. Because the parameters are reference // parameters of type object, you have to create an object variable // for the arguments that represents 'no value'. object useDefaultValue = Type.Missing; wordApp.Documents.Add(ref useDefaultValue, ref useDefaultValue, ref useDefaultValue, ref useDefaultValue); // PasteSpecial has seven reference parameters, all of which are // optional. In this example, only two of the parameters require // specified values, but in Visual C# 2008 an argument must be sent // for each parameter. Because the parameters are reference parameters, // you have to contruct variables for the arguments. object link = true; object displayAsIcon = true; wordApp.Selection.PasteSpecial( ref useDefaultValue, ref link, ref useDefaultValue, ref displayAsIcon, ref useDefaultValue, ref useDefaultValue, ref useDefaultValue); }
Ajoutez l'instruction suivante à la fin de Main.
// Create a Word document that contains an icon that links to // the spreadsheet. CreateIconInWordDoc();
Ajoutez l'instruction suivante à la fin de DisplayInExcel.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 la combinaison de touches CTRL+F5.
Un document Word contenant une icône s'affiche.Double-cliquez sur l'icône pour placer la feuille de calcul au premier plan.
Pour définir la propriété Incorporer les types d'interopérabilité
D'autres améliorations sont possibles lorsque vous appelez un type COM qui ne requiert pas d'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 ne faisant pas appel aux assemblys PIA, consultez Procédure pas à pas : incorporation de types provenant d'assemblys managés (C# et Visual Basic).
En outre, la programmation est plus facile car les types qui sont requis et retournés par les méthodes COM peuvent être représentés à l'aide du type dynamic, et non pas avec Object.Les variables de type dynamic ne sont pas évaluées avant l'exécution, ce qui élimine le recours au cast explicite.Pour plus d'informations, consultez Utilisation du type dynamic (Guide de programmation C#).
En Visual C# 2010, le comportement par défaut consiste à incorporer les informations de type au lieu d'utiliser les assembly PIA.Ce comportement par défaut permet de simplifier plusieurs des exemples précédents car le cast explicite n'est pas nécessaire.Par exemple, la déclaration de worksheet dans DisplayInExcel est écrite sous la forme Excel._Worksheet workSheet = excelApp.ActiveSheet, et non pas sous la forme Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet.Les appels à AutoFit dans la même méthode nécessiteraient également le cast explicite sans la valeur par défaut, car ExcelApp.Columns[1] retourne un Object et AutoFit est une méthode Excel.Le code suivant illustre l'opération de cast.
((Excel.Range)workSheet.Columns[1]).AutoFit(); ((Excel.Range)workSheet.Columns[2]).AutoFit();
Pour modifier le comportement par défaut et utiliser des 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'est pas visible, appuyez sur F4.
Recherchez la propriété Incorporer les types d'interopérabilité dans la liste de propriétés et remplacez sa valeur par False.De façon équivalente, vous pouvez effectuer la compilation en utilisant l'option de compilateur /reference au lieu de /link à une invite de commandes.
Pour ajouter une mise en forme supplémentaire au tableau
Remplacez les deux appels à AutoFit dans DisplayInExcel par l'instruction suivante.
// Call to AutoFormat in Visual C# 2010. workSheet.Range["A1", "B3"].AutoFormat( Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
La méthode AutoFormat comporte sept paramètres de valeur, qui sont tous optionnels.Les arguments nommés et facultatifs vous permettent de fournir des arguments pour tous ces paramètres ou certains d'entre eux ; vous pouvez également ne pas fournir d'arguments.Dans l'instruction précédente, un argument est fourni pour un seul des paramètres, Format.Étant donné que Format est le premier paramètre de la liste, vous n'êtes pas obligé d'indiquer le nom du paramètre.Toutefois, l'instruction peut être plus facile à comprendre si le nom du paramètre est inclus, 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.D'autres formats sont présentés dans la rubrique Énumération XlRangeAutoFormat (page éventuellement en anglais).
Comparez l'instruction de l'étape 1 au code suivant, qui indique les arguments requis dans Visual C# 2008 ou les versions antérieures.
// The AutoFormat method has seven optional value parameters. The // following call specifies a value for the first parameter, and uses // the default values for the other six. // Call to AutoFormat in Visual C# 2008. This code is not part of the // current solution. excelApp.get_Range("A1", "B4").AutoFormat(Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Exemple
Le code suivant illustre l'exemple complet.
using System;
using System.Collections.Generic;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
namespace OfficeProgramminWalkthruComplete
{
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 praticular 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# 2010. 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# 2010 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
Tâches
Référence
Concepts
Arguments nommés et facultatifs (Guide de programmation C#)