Partager via


Extension de documents Word et de classeurs Excel dans des compléments d'application au moment de l'exécution.

Vous pouvez utiliser un complément d'application pour personnaliser des documents Word et des classeurs Excel de différentes façons :

  • ajouter des contrôles gérés à tout document ou feuille de calcul ouvert ;

  • convertir un objet de liste existant sur une feuille de calcul Excel en un ListObject étendu qui expose des événements et peut être lié aux données à l'aide du modèle de liaison de données Windows Forms ;

  • accéder à des événements au niveau de l'application qui sont exposés par Word et Excel pour des documents, des classeurs et des feuilles de calcul spécifiques.

Pour utiliser cette fonctionnalité, vous devez générer au moment de l'exécution un objet qui étend le document ou le classeur.

s'applique : que les informations de cette rubrique s'appliquent aux projets d'application pour les applications suivantes : Excel 2010 ; Word 2010.Pour plus d’informations, consultez Fonctionnalités disponibles par type d'application et de projet Office.

Génération d'objets étendus dans les compléments

Les objets étendus sont des instances des types fournis par le runtime de Visual Studio Tools pour Office qui ajoutent des fonctionnalités aux objets qui existent en mode natif dans Word ou les modèles objet Excel ( objets Office natifs).Pour générer un objet étendu pour un objet Word ou Excel, utilisez la méthode GetVstoObject.La première fois que vous appelez la méthode d' GetVstoObject pour un objet spécifié Word ou excel, il retourne un objet qui étend l'objet spécifié. Chaque fois que vous appelez la méthode et spécifiez le même objet Word ou excel, il retourne le même objet étendu.

Le nom du type de l'objet étendu est identique à celui du type de l'objet Office natif, mais le type est défini dans l'espace de noms Microsoft.Office.Tools.Excel ou Microsoft.Office.Tools.Word.Par exemple, si vous appelez la méthode GetVstoObject pour étendre un objet Microsoft.Office.Interop.Word.Document, la méthode retourne un objet Microsoft.Office.Tools.Word.Document.

Les méthodes GetVstoObject sont destinées à être utilisées principalement dans les projets au niveau de l'application.Vous pouvez également les utiliser dans des projets au niveau du document, mais elles se comporteront différemment et auront moins d'applications.

Pour déterminer si un objet étendu a déjà été généré pour un objet Office natif particulier, utilisez la méthode HasVstoObject.Pour plus d'informations, consultez Déterminer si un objet Office a été étendu.

Cc442981.collapse_all(fr-fr,VS.110).gifGénération d'éléments hôtes

Lorsque vous utilisez le GetVstoObject pour étendre un objet au niveau du document, c'est-à-dire Microsoft.Office.Interop.Excel.Workbook, Microsoft.Office.Interop.Excel.Worksheet ou Microsoft.Office.Interop.Word.Document), l'objet retourné est appelé élément hôte.Un élément hôte est un type d'élément qui peut contenir d'autres objets, y compris d'autres objets étendus et des contrôles.Il ressemble au type correspondant dans l'assembly PIA (Primary Interop Assembly) Word ou Excel, mais il comporte des fonctionnalités supplémentaires.Pour plus d'informations sur les éléments hôtes, consultez Vue d'ensemble des éléments hôtes et des contrôles hôtes.

Après avoir généré un élément hôte, vous pouvez l'utiliser pour ajouter des contrôles managés au document, au classeur, ou à la feuille de calcul.Pour plus d'informations, consultez l' Ajouter des contrôles managés aux documents et aux feuilles de calcul.

Pour générer un élément hôte pour un document Word

  • L'exemple de code suivant montre comment générer un élément hôte pour le document actif.

    If Globals.ThisAddIn.Application.Documents.Count > 0 Then
        Dim NativeDocument As Microsoft.Office.Interop.Word.Document = _
            Globals.ThisAddIn.Application.ActiveDocument
        Dim VstoDocument As Microsoft.Office.Tools.Word.Document = _
            Globals.Factory.GetVstoObject(NativeDocument)
    End If
    
    if (Globals.ThisAddIn.Application.Documents.Count > 0)
    {
        Microsoft.Office.Interop.Word.Document nativeDocument =
            Globals.ThisAddIn.Application.ActiveDocument;
        Microsoft.Office.Tools.Word.Document vstoDocument =
            Globals.Factory.GetVstoObject(nativeDocument);
    }
    

Pour générer un élément hôte pour un classeur Excel

  • L'exemple de code suivant montre comment générer un élément hôte pour le classeur actif.

    Dim NativeWorkbook As Microsoft.Office.Interop.Excel.Workbook =
        Globals.ThisAddIn.Application.ActiveWorkbook
    If NativeWorkbook IsNot Nothing Then
        Dim vstoWorkbook As Microsoft.Office.Tools.Excel.Workbook =
            Globals.Factory.GetVstoObject(NativeWorkbook)
    End If
    
    Microsoft.Office.Interop.Excel.Workbook nativeWorkbook = 
        Globals.ThisAddIn.Application.ActiveWorkbook;
    if (nativeWorkbook != null)
    {
        Microsoft.Office.Tools.Excel.Workbook vstoWorkbook = 
            Globals.Factory.GetVstoObject(nativeWorkbook);
    }
    

Pour générer un élément hôte pour une feuille de calcul Excel

  • L'exemple de code suivant montre comment générer un élément hôte de la feuille de calcul active dans un projet.

    Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
        Globals.ThisAddIn.Application.ActiveSheet
    If NativeWorksheet IsNot Nothing Then
        Dim vstoSheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    End If
    
    Microsoft.Office.Interop.Excel.Worksheet nativeWorksheet =
        Globals.ThisAddIn.Application.ActiveSheet;
    if (nativeWorksheet != null)
    {
        Microsoft.Office.Tools.Excel.Worksheet vstoSheet = 
            Globals.Factory.GetVstoObject(nativeWorksheet);
    }
    

Cc442981.collapse_all(fr-fr,VS.110).gifGénération de contrôles hôtes ListObject

Lorsque vous utilisez la méthode GetVstoObject pour étendre un Microsoft.Office.Interop.Excel.ListObject, elle retourne un Microsoft.Office.Tools.Excel.ListObject.Le Microsoft.Office.Tools.Excel.ListObject généré possède toutes les caractéristiques du Microsoft.Office.Interop.Excel.ListObject d'origine, mais il comporte également des fonctionnalités supplémentaires, telles que la capacité de se lier aux données en utilisant le modèle de liaison de données Windows Forms.Pour plus d'informations, consultez ListObject, contrôle.

Pour générer un contrôle hôte pour un ListObject

  • L'exemple de code suivant montre comment générer Microsoft.Office.Tools.Excel.ListObject pour le premier Microsoft.Office.Interop.Excel.ListObject dans la feuille de calcul active dans un projet.

    Dim sheet As Microsoft.Office.Interop.Excel.Worksheet =
        Globals.ThisAddIn.Application.ActiveSheet
    If sheet.ListObjects.Count > 0 Then
        Dim listObject As Excel.ListObject = sheet.ListObjects(1)
        Dim vstoListObject As Microsoft.Office.Tools.Excel.ListObject =
            Globals.Factory.GetVstoObject(listObject)
    End If
    
    Microsoft.Office.Interop.Excel.Worksheet sheet =
        Globals.ThisAddIn.Application.ActiveSheet;
    if (sheet.ListObjects.Count > 0)
    {
        Excel.ListObject listObject = 
            sheet.ListObjects[1];
        Microsoft.Office.Tools.Excel.ListObject vstoListObject =
            Globals.Factory.GetVstoObject(listObject);
    }
    

Ajout de contrôles gérés aux documents et feuilles de calcul

Après avoir généré Microsoft.Office.Tools.Word.Document ou Microsoft.Office.Tools.Excel.Worksheet, vous pouvez ajouter des contrôles au document ou à la feuille de calcul que ces objets étendus représentent.Pour cela, utilisez la propriété Controls de Microsoft.Office.Tools.Word.Document ou de Microsoft.Office.Tools.Excel.Worksheet.Pour plus d'informations, consultez Ajout de contrôles à des documents Office au moment de l'exécution.

Vous pouvez ajouter des contrôles Windows Forms ou des contrôles hôtes.Un contrôle hôte est un contrôle fourni par le Visual Studio Tools pour Office Runtime qui encapsule un contrôle correspondant dans l'assembly PIA de Word ou d'Excel.Un contrôle hôte expose l'ensemble du comportement de l'objet Office natif sous-jacent, mais il déclenche également des événements et peut être lié aux données en utilisant le modèle de liaison de données Windows Forms.Pour plus d'informations, consultez Vue d'ensemble des éléments hôtes et des contrôles hôtes.

[!REMARQUE]

Vous ne pouvez pas ajouter de contrôle d' XmlMappedRange à une feuille de calcul, ou un contrôle d' XMLNode ou d' XMLNodes à un document, à l'aide d'un complément.Ces contrôles ne peuvent pas être ajoutés par programmation.Pour plus d'informations, consultez Limitations de programmation des éléments hôtes et des contrôles hôtes.

Cc442981.collapse_all(fr-fr,VS.110).gifPersistance et suppression de contrôles

Lorsque vous ajoutez des contrôles gérés à un document ou à une feuille de calcul, les contrôles ne sont pas rendus persistant lorsque le document est enregistré puis fermé.Tous les contrôles hôtes sont supprimés afin que seuls les objets Office natifs sous-jacents soient conservés.Par exemple, Microsoft.Office.Tools.Excel.ListObject devient Microsoft.Office.Interop.Excel.ListObject.Tous les contrôles Windows Forms sont également supprimés, mais leurs wrappers ActiveX sont conservés dans le document.Vous devez inclure le code dans votre complément afin de nettoyer les contrôles, ou de les recréer à la prochaine ouverture du document.Pour plus d'informations, consultez Rendre des contrôles dynamiques persistants dans des documents Office.

Accès aux événements au niveau de l'application sur des documents et des classeurs

Certains événements de document, classeur et feuille de calcul dans les objets Word et Excel natifs sont déclenchés uniquement au niveau de l'application.Par exemple, l'événement DocumentBeforeSave est déclenché lorsqu'un document est ouvert dans Word, mais il est défini dans la classe Microsoft.Office.Interop.Word.Application, plutôt que dans la classe Microsoft.Office.Interop.Word.Document.

Lorsque vous utilisez uniquement des objets Office natifs dans votre complément, vous devez gérer ces événements au niveau de l'application puis écrire du code supplémentaire afin de déterminer si le document qui a déclenché l'événement est un document que vous avez personnalisé.Les éléments hôtes fournissent ces événements au niveau du document, afin qu'il soit plus facile de les gérer pour un document spécifique.Vous pouvez générer un élément hôte puis gérer l'événement pour cet élément hôte.

Cc442981.collapse_all(fr-fr,VS.110).gifExemple avec utilisation d'objets Word natifs

L'exemple de code suivant montre comment gérer un événement au niveau de l'application pour les documents Word.La méthode CreateDocument crée un nouveau document, puis définit un gestionnaire d'événements DocumentBeforeSave qui empêche ce document d'être enregistré.Étant donné qu'il s'agit d'un événement au niveau de l'application qui est déclenché pour l'objet Microsoft.Office.Interop.Word.Application, le gestionnaire d'événements doit comparer le paramètre Doc avec l'objet document1 afin de déterminer si document1 représente le document enregistré.

Private document1 As Word.Document = Nothing

Private Sub CreateDocument1()
    document1 = Me.Application.Documents.Add()
End Sub

Private Sub Application_DocumentBeforeSave(ByVal Doc As Word.Document, _
    ByRef SaveAsUI As Boolean, ByRef Cancel As Boolean) _
    Handles Application.DocumentBeforeSave
    If Type.ReferenceEquals(Doc, document1) Then
        Cancel = True
    End If
End Sub
private Word.Document document1 = null;

private void CreateDocument1()
{
    document1 = this.Application.Documents.Add(ref missing,
        ref missing, ref missing, ref missing);
    this.Application.DocumentBeforeSave += 
        new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(
        Application_DocumentBeforeSave);
}

private void Application_DocumentBeforeSave(Word.Document Doc, 
    ref bool SaveAsUI, ref bool Cancel)
{
    if (Type.ReferenceEquals(Doc, document1)) 
    {
        Cancel = true;
    }
}

Cc442981.collapse_all(fr-fr,VS.110).gifExemple avec utilisation d'un élément hôte

Les exemples de code suivants simplifient ce processus en gérant l'événement BeforeSave d'un élément hôte Microsoft.Office.Tools.Word.Document.La méthode CreateDocument2 dans ces exemples génère un Microsoft.Office.Tools.Word.Document qui étend l'objet document2, puis elle définit un gestionnaire d'événements BeforeSave qui empêche le document d'être enregistré.Étant donné que ce gestionnaire d'événements est appelé uniquement lorsque document2 est enregistré, le gestionnaire d'événements peut annuler l'action de sauvegarde sans avoir à vérifier en plus quel document a été enregistré.

L'exemple de code suivant montre cette tâche.

Private document2 As Word.Document = Nothing
Private WithEvents vstoDocument As Microsoft.Office.Tools.Word.Document = Nothing

Private Sub CreateDocument2()
    document2 = Me.Application.Documents.Add()
    vstoDocument = Globals.Factory.GetVstoObject(document2)
End Sub

Private Sub vstoDocument_BeforeSave(ByVal sender As Object, _
    ByVal e As SaveEventArgs) Handles vstoDocument.BeforeSave
    e.Cancel = True
End Sub
private Word.Document document2 = null;
private Microsoft.Office.Tools.Word.Document vstoDocument = null;

private void CreateDocument2()
{
    document2 = this.Application.Documents.Add(ref missing,
        ref missing, ref missing, ref missing);
    vstoDocument = Globals.Factory.GetVstoObject(document2);
    vstoDocument.BeforeSave += new SaveEventHandler(vstoDocument_BeforeSave);
}

private void vstoDocument_BeforeSave(object sender, SaveEventArgs e)
{
    e.Cancel = true;
}

Déterminer si un objet Office a été étendu

Pour déterminer si un objet étendu a déjà été généré pour un objet Office natif particulier, utilisez la méthode HasVstoObject.Cette méthode retourne la valeur true si un objet étendu a déjà été généré ; sinon, elle retourne la valeur false.

Utilisez la méthode Globals.Factory.HasVstoMethod.Passez dans l'objet Word ou Excel natif, tel qu' Microsoft.Office.Interop.Word.Document ou Microsoft.Office.Interop.Excel.Worksheet, que vous souhaitez tester pour un objet étendu.

La méthode HasVstoObject s'avère utile lorsque vous voulez exécuter du code uniquement lorsqu'un objet Office spécifié possède un objet étendu.Par exemple, si vous avez un complément Word qui gère l'événement DocumentBeforeSave pour supprimer des contrôles gérés d'un document avant qu'il ne soit enregistré, vous pouvez utiliser la méthode HasVstoObject pour déterminer si le document a été étendu.Si le document n'a pas été étendu, il ne peut pas contenir de contrôles gérés, et par conséquent, le gestionnaire d'événements peut simplement retourner une valeur sans essayer de nettoyer des contrôles sur le document.

Voir aussi

Concepts

Ajout de contrôles à des documents Office au moment de l'exécution

Vue d'ensemble des éléments hôtes et des contrôles hôtes

Autres ressources

Programmation de compléments d'application

Exemples et procédures pas à pas relatifs au développement Office