Partager via


Ajouter des tableaux à des documents de traitement de texte

Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin d’ajouter par programmation un tableau à un document de traitement de texte. Elle présente un exemple de la méthode AddTable pour illustrer cette tâche.

AddTable, méthode

Vous pouvez utiliser la méthode AddTable pour ajouter un tableau simple à un document de traitement de texte. La méthode AddTable accepte deux paramètres, indiquant les éléments suivants :

  • Le nom du document à modifier (chaîne).

  • Un tableau bidimensionnel de chaînes à insérer dans le document sous forme de tableau.

    public static void AddTable(string fileName, string[,] data)

Appeler la méthode AddTable

La méthode AddTable modifie les documents que vous spécifiez, en ajoutant un tableau contenant les informations dans le tableau bidimensionnel que vous fournissez. Pour appeler la méthode, passez les deux valeurs de paramètres, comme dans le code suivant.

    const string fileName = @"C:\Users\Public\Documents\AddTable.docx";
    AddTable(fileName, new string[,] 
        { { "Texas", "TX" }, 
        { "California", "CA" }, 
        { "New York", "NY" }, 
        { "Massachusetts", "MA" } }
        );

Fonctionnement du code

Le code ouvre d'abord le document à l'aide de la méthode WordprocessingDocument.Open en indiquant que le document doit être ouvert en accès lecture/écriture (la valeur finale true du paramètre). Ensuite, le code récupère une référence à l’élément racine du composant de document main, à l’aide de la propriété Document du MainDocumentPart du document de traitement de texte.

    using (var document = WordprocessingDocument.Open(fileName, true))
    {
        var doc = document.MainDocumentPart.Document;
        // Code removed here…
    }

Créer l’objet table et définir ses propriétés

Avant de pouvoir insérer un tableau dans un document, vous devez créer l'objet Table et définir ses propriétés. Pour définir les propriétés d’une table, vous créez et fournissez des valeurs pour un objet TableProperties . La classe TableProperties fournit de nombreuses propriétés orientées table, telles que Shading, TableBorders, TableCaption, TableCellSpacing, TableJustification, etc. L'exemple de méthode inclut le code suivant.

    Table table = new Table();

    TableProperties props = new TableProperties(
        new TableBorders(
        new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
        new BottomBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new LeftBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new RightBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new InsideHorizontalBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new InsideVerticalBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
    }));

    table.AppendChild<TableProperties>(props);

Le constructeur de la classe TableProperties vous permet de spécifier autant d’éléments enfants que vous le souhaitez (tout comme le constructeur XElement ). Dans ce cas, le code crée les éléments enfants TopBorder, BottomBorder, LeftBorder, RightBorder, InsideHorizontalBorder et InsideVerticalBorder , chacun décrivant l’un des éléments de bordure de la table. Pour chaque élément, le code définit les propriétés Val et Size dans le cadre de l'appel du constructeur. La définition de la propriété Size est simple, mais celle de la propriété Val nécessite un peu plus d'effort : cette propriété, pour l'objet particulier, représente le style de bordure, et vous devez la définir à une valeur énumérée. Pour ce faire, créez un instance du type générique EnumValue<T>, en passant le type de bordure spécifique (Single en tant que paramètre au constructeur. Une fois que le code a défini toute la valeur de bordure de table qu’il doit définir, il appelle la méthode AppendChild<T> de la table, indiquant que le type générique est [TableProperties](/dotnet/api/ ocumentformat.openxml.wordprocessing.tableproperties) ; autrement dit, il ajoute une instance de la classe TableProperties, en utilisant les propriétés de variable comme valeur.

Remplir la table avec des données

Maintenant que vous disposez de ce tableau et de ses propriétés, vous pouvez maintenant le remplir avec des données. L'exemple de procédure itère d'abord dans toutes les lignes de données du tableau de chaînes que vous avez spécifié, créant une nouvelle instance TableRow pour chaque ligne de données. Le code suivant n'inclut pas les détails de l'opération de remplissage de la ligne avec des données, mais il montre comment créer la ligne et l'ajouter au tableau :

    for (var i = 0; i <= data.GetUpperBound(0); i++)
    {
        var tr = new TableRow();
        // Code removed here…
        table.Append(tr);
    }

Pour chaque ligne, le code parcourt toutes les colonnes du tableau de chaînes que vous spécifiez. Pour chaque colonne, il crée un nouvel objet TableCell , le remplit de données et l'ajoute à la ligne. Le code suivant n'inclut pas les détails de l'opération de remplissage de chaque cellule avec des données, mais il montre comment créer la colonne et l'ajouter au tableau :

    for (var j = 0; j <= data.GetUpperBound(1); j++)
    {
        var tc = new TableCell();
        // Code removed here…
        tr.Append(tc);
    }

Ensuite, le code effectue les opérations suivantes :

  • Il crée un nouvel objet Text qui contient une valeur provenant du tableau de chaînes.
  • Transmet l’objet Text au constructeur pour un nouvel objet Run .
  • Transmet l’objet Run au constructeur pour un nouvel objet Paragraph .
  • Transmet l’objet Paragraph à la méthode Appendde la cellule.

En d'autres mots, le code suivant ajoute le texte au nouvel objet TableCell.

    tc.Append(new Paragraph(new Run(new Text(data[i, j]))));

Le code ajoute ensuite un nouvel objet TableCellProperties à la cellule. Cet objet TableCellProperties, tout comme l'objet TableProperties que vous avez déjà vu, peut accepter autant d'objets dans son constructeur que vous pouvez fournir. Dans ce cas, le code transmet uniquement un nouvel objet TableCellWidth , avec sa propriété Type définie sur Auto (afin que la table dimensionne automatiquement la largeur de chaque colonne).

    // Assume you want columns that are automatically sized.
    tc.Append(new TableCellProperties(
        new TableCellWidth { Type = TableWidthUnitValues.Auto }));

Terminer

Le code suivant conclut l'opération en ajoutant le tableau au corps du document, et en enregistrant le document.

    doc.Body.Append(table);
    doc.Save();

Exemple de code

Voici l'exemple de code AddTable complet en C# et Visual Basic.

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

AddTable(args[0], args[1]);

// Take the data from a two-dimensional array and build a table at the 
// end of the supplied document.
static void AddTable(string fileName, string json)
{
    // read the data from the json file
    var data = System.Text.Json.JsonSerializer.Deserialize<string[][]>(json);

    if (data is not null)
    {
        using (var document = WordprocessingDocument.Open(fileName, true))
        {
            if (document.MainDocumentPart is null || document.MainDocumentPart.Document.Body is null)
            {
                throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
            }

            var doc = document.MainDocumentPart.Document;

            Table table = new();

            TableProperties props = new(
                new TableBorders(
                new TopBorder
                {
                    Val = new EnumValue<BorderValues>(BorderValues.Single),
                    Size = 12
                },
                new BottomBorder
                {
                    Val = new EnumValue<BorderValues>(BorderValues.Single),
                    Size = 12
                },
                new LeftBorder
                {
                    Val = new EnumValue<BorderValues>(BorderValues.Single),
                    Size = 12
                },
                new RightBorder
                {
                    Val = new EnumValue<BorderValues>(BorderValues.Single),
                    Size = 12
                },
                new InsideHorizontalBorder
                {
                    Val = new EnumValue<BorderValues>(BorderValues.Single),
                    Size = 12
                },
                new InsideVerticalBorder
                {
                    Val = new EnumValue<BorderValues>(BorderValues.Single),
                    Size = 12
                }));

            table.AppendChild<TableProperties>(props);

            for (var i = 0; i < data.Length; i++)
            {
                var tr = new TableRow();
                for (var j = 0; j < data[i].Length; j++)
                {
                    var tc = new TableCell();
                    tc.Append(new Paragraph(new Run(new Text(data[i][j]))));

                    // Assume you want columns that are automatically sized.
                    tc.Append(new TableCellProperties(
                        new TableCellWidth { Type = TableWidthUnitValues.Auto }));

                    tr.Append(tc);
                }
                table.Append(tr);
            }
            doc.Body.Append(table);
            doc.Save();
        }
    }
}