Comment automatiser Microsoft Word pour créer un document à l’aide de Visual C #

Pour obtenir une version .NET de Microsoft Visual Basic de cet article, consultez

Résumé

Cet article pas à pas explique comment créer un document dans Microsoft Word à l’aide d’Automation à partir de Microsoft Visual C# 2005 ou de Microsoft Visual C# .NET.

Exemple de code

L’exemple de code de cet article montre comment effectuer les opérations suivantes :

  • Insérer des paragraphes avec du texte et une mise en forme.
  • Parcourez et modifiez différentes plages dans un document.
  • Insérez des tables, mettez en forme des tables et remplissez les tables avec des données.
  • Ajoutez un graphique.

Pour créer un document Word à l’aide d’Automation à partir de Visual C# 2005 ou Visual C# .NET, procédez comme suit :

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

  2. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sous Types de projets, cliquez sur Projets Visual C#, puis sur Application Windows sous Modèles. Form1 est créé par défaut.

    Note Dans Visual Studio 2005, cliquez sur Visual C# au lieu de Visual C# Projects.

  3. Ajoutez une référence à la bibliothèque d’objets Microsoft Word. 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 Word, puis cliquez sur Sélectionner.

    Note Dans Visual Studio 2005, vous n’avez pas besoin de cliquer sur Sélectionner.

    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.

    1. 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.
  4. Dans le menu Affichage, sélectionnez Boîte à outils pour afficher la boîte à outils, puis ajoutez un bouton à Form1.

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

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

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

    avec :

    private void button1_Click(object sender, System.EventArgs e)
    {
    object oMissing = System.Reflection.Missing.Value;
    object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */ 
    
    //Start Word and create a new document.
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
    
    //Insert a paragraph at the beginning of the document.
    Word.Paragraph oPara1;
    oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);
    oPara1.Range.Text = "Heading 1";
    oPara1.Range.Font.Bold = 1;
    oPara1.Format.SpaceAfter = 24;    //24 pt spacing after paragraph.
    oPara1.Range.InsertParagraphAfter();
    
    //Insert a paragraph at the end of the document.
    Word.Paragraph oPara2;
    object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oPara2 = oDoc.Content.Paragraphs.Add(ref oRng);
    oPara2.Range.Text = "Heading 2";
    oPara2.Format.SpaceAfter = 6;
    oPara2.Range.InsertParagraphAfter();
    
    //Insert another paragraph.
    Word.Paragraph oPara3;
    oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oPara3 = oDoc.Content.Paragraphs.Add(ref oRng);
    oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:";
    oPara3.Range.Font.Bold = 0;
    oPara3.Format.SpaceAfter = 24;
    oPara3.Range.InsertParagraphAfter();
    
    //Insert a 3 x 5 table, fill it with data, and make the first row
    //bold and italic.
    Word.Table oTable;
    Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);
    oTable.Range.ParagraphFormat.SpaceAfter = 6;
    int r, c;
    string strText;
    for(r = 1; r <= 3; r++)
    for(c = 1; c <= 5; c++)
    {
    strText = "r" + r + "c" + c;
    oTable.Cell(r, c).Range.Text = strText;
    }
    oTable.Rows[1].Range.Font.Bold = 1;
    oTable.Rows[1].Range.Font.Italic = 1;
    
    //Add some text after the table.
    Word.Paragraph oPara4;
    oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oPara4 = oDoc.Content.Paragraphs.Add(ref oRng);
    oPara4.Range.InsertParagraphBefore();
    oPara4.Range.Text = "And here's another table:";
    oPara4.Format.SpaceAfter = 24;
    oPara4.Range.InsertParagraphAfter();
    
    //Insert a 5 x 2 table, fill it with data, and change the column widths.
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);
    oTable.Range.ParagraphFormat.SpaceAfter = 6;
    for(r = 1; r <= 5; r++)
    for(c = 1; c <= 2; c++)
    {
    strText = "r" + r + "c" + c;
    oTable.Cell(r, c).Range.Text = strText;
    }
    oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2
    oTable.Columns[2].Width = oWord.InchesToPoints(3);
    
    //Keep inserting text. When you get to 7 inches from top of the
    //document, insert a hard page break.
    object oPos;
    double dPos = oWord.InchesToPoints(7);
    oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();
    do
    {
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.ParagraphFormat.SpaceAfter = 6;
    wrdRng.InsertAfter("A line of text");
    wrdRng.InsertParagraphAfter();
    oPos = wrdRng.get_Information
                           (Word.WdInformation.wdVerticalPositionRelativeToPage);
    }
    while(dPos >= Convert.ToDouble(oPos));
    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
    object oPageBreak = Word.WdBreakType.wdPageBreak;
    wrdRng.Collapse(ref oCollapseEnd);
    wrdRng.InsertBreak(ref oPageBreak);
    wrdRng.Collapse(ref oCollapseEnd);
    wrdRng.InsertAfter("We're now on page 2. Here's my chart:");
    wrdRng.InsertParagraphAfter();
    
    //Insert a chart.
    Word.InlineShape oShape;
    object oClassType = "MSGraph.Chart.8";
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing);
    
    //Demonstrate use of late bound oChart and oChartApp objects to
    //manipulate the chart object with MSGraph.
    object oChart;
    object oChartApp;
    oChart = oShape.OLEFormat.Object;
    oChartApp = oChart.GetType().InvokeMember("Application",
    BindingFlags.GetProperty, null, oChart, null);
    
    //Change the chart type to Line.
    object[] Parameters = new Object[1];
    Parameters[0] = 4; //xlLine = 4
    oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,
    null, oChart, Parameters);
    
    //Update the chart image and quit MSGraph.
    oChartApp.GetType().InvokeMember("Update",
    BindingFlags.InvokeMethod, null, oChartApp, null);
    oChartApp.GetType().InvokeMember("Quit",
    BindingFlags.InvokeMethod, null, oChartApp, null);
    //... If desired, you can proceed from here using the Microsoft Graph 
    //Object model on the oChart and oChartApp objects to make additional
    //changes to the chart.
    
    //Set the width of the chart.
    oShape.Width = oWord.InchesToPoints(6.25f);
    oShape.Height = oWord.InchesToPoints(3.57f);
    
    //Add text after the chart.
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.InsertParagraphAfter();
    wrdRng.InsertAfter("THE END.");
    
    //Close this form.
    this.Close();
    }
    
  7. 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 Word = Microsoft.Office.Interop.Word;
    using System.Reflection;
    
  8. Appuyez sur F5 pour générer et exécuter le programme.

  9. Cliquez sur Button1 pour démarrer Word Automation et créer le document.

Une fois le code terminé, examinez le document qui a été créé pour vous. Le document contient deux pages de paragraphes mis en forme, des tableaux et un graphique.

Utiliser un modèle

Si vous utilisez Automation pour créer des documents qui sont tous dans un format commun, vous pouvez tirer parti du démarrage du processus avec un nouveau document basé sur un modèle préformaté. L’utilisation d’un modèle avec votre client Word Automation présente deux avantages significatifs par rapport à la création d’un document à partir de rien :

  • Vous pouvez avoir un meilleur contrôle sur la mise en forme et le placement des objets dans vos documents.
  • Vous pouvez générer vos documents avec moins de code.

À l’aide d’un modèle, vous pouvez ajuster le positionnement des tableaux, paragraphes et autres objets dans le document, ainsi qu’inclure une mise en forme sur ces objets. À l’aide d’Automation, vous pouvez créer un document basé sur votre modèle avec du code tel que le suivant :

object oTemplate = "c:\\MyTemplate.dot";
oDoc = oWord.Documents.Add(ref oTemplate, ref oMissing,
ref oMissing, ref oMissing);

Dans votre modèle, vous pouvez définir des signets afin que votre client Automation puisse remplir du texte variable à un emplacement spécifique du document, comme suit :

object oBookMark = "MyBookmark";
oDoc.Bookmarks.Item(ref oBookMark).Range.Text = "Some Text Here";

Un autre avantage de l’utilisation d’un modèle est que vous pouvez créer et stocker des styles de mise en forme que vous souhaitez appliquer au moment de l’exécution, comme suit :

object oStyleName = "MyStyle";
oDoc.Bookmarks.Item(ref oBookMark).Range.set_Style(ref oStyleName);

ou

object oStyleName = "MyStyle";
oWord.Selection.set_Style(ref oStyleName);

References

Pour plus d’informations, consultez les articles de la Base de connaissances Microsoft :