Insérer un tableau dans un document de traitement de texte
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin d’insérer par programmation un tableau dans un document de traitement de texte.
Obtention d’un objet WordprocessingDocument
Pour ouvrir un document existant, instanciez la WordprocessingDocument classe comme indiqué dans l’instruction suivante using
. Dans la même instruction, ouvrez le fichier de traitement de texte au niveau du chemin de fichier spécifié à l’aide de la Open méthode , avec le paramètre booléen défini true
sur afin de permettre la modification du document.
using (WordprocessingDocument doc = WordprocessingDocument.Open(fileName, true))
Avec v3.0.0+ la Close() méthode a été supprimée au profit de l’instruction using.
Il garantit que la Dispose() méthode est automatiquement appelée lorsque l’accolade fermante est atteinte. Le bloc qui suit l’instruction using établit une étendue pour l’objet créé ou nommé dans l’instruction using. Étant donné que la WordprocessingDocument classe du Kit de développement logiciel (SDK) Open XML enregistre et ferme automatiquement l’objet dans le cadre de son IDisposable implémentation, et que Dispose() est appelée automatiquement lorsque vous quittez le bloc, vous n’avez pas à appeler Save() explicitement ou Dispose() tant que vous utilisez une using
instruction.
Structure d’un tableau
La structure de base d’un WordProcessingML
document se compose des document
éléments et body
, suivis d’un ou plusieurs éléments de niveau bloc tels que p
, qui représente un paragraphe. Un paragraphe contient un ou plusieurs r
éléments. Le r signifie « run » (exécution), qui est une zone de texte avec un ensemble de propriétés courant, comme par exemple la mise en forme. Une exécution contient un ou plusieurs t
éléments. L’élément t
contient une plage de texte. Le document peut contenir une table comme dans cet exemple. Un tableau est un ensemble de paragraphes (et d’autre contenu au niveau bloc) disposés en lignes et en colonnes. Les tables dans WordprocessingML
sont définies via l’élément tbl
, qui est analogue à la balise de table HTML. Prenons l’exemple d’un tableau vide à une cellule (c’est-à-dire un tableau avec une ligne, une colonne) et des bordures à 1 point sur tous les côtés. Cette table est représentée par le segment de balisage suivant WordprocessingML
.
<w:tbl>
<w:tblPr>
<w:tblW w:w="5000" w:type="pct"/>
<w:tblBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:left w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
</w:tblBorders>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="10296"/>
</w:tblGrid>
<w:tr>
<w:tc>
<w:tcPr>
<w:tcW w:w="0" w:type="auto"/>
</w:tcPr>
<w:p/>
</w:tc>
</w:tr>
</w:tbl>
Ce tableau spécifie des propriétés à l’échelle du tableau de 100 % de la largeur de page à l’aide de l’élément tblW
, un ensemble de bordures de table utilisant l’élément tblBorders
, la grille de table, qui définit un ensemble de bords verticaux partagés dans la table à l’aide de l’élément tblGrid
, et une seule ligne de table utilisant l’élément tr
.
Fonctionnement de l’exemple de code
Dans l’exemple de code, après avoir ouvert le document dans l’instruction using
, vous créez un Table objet . Ensuite, vous créez un TableProperties objet et spécifiez ses informations de bordure.
La TableProperties classe contient un constructeur TableProperties() surchargé qui accepte un params
tableau de type OpenXmlElement. Le code utilise ce constructeur pour instancier un TableProperties
objet avec BorderType des objets pour chaque bordure, instanciant chacun BorderType
et spécifiant sa valeur à l’aide d’initialiseurs d’objets.
Une fois qu’il a été instancié, ajoutez l’objet TableProperties
à la table.
// Create an empty table.
Table table = new Table();
// Create a TableProperties object and specify its border information.
TableProperties tblProp = new TableProperties(
new TableBorders(
new TopBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new BottomBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new LeftBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new RightBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new InsideHorizontalBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new InsideVerticalBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
}
)
);
// Append the TableProperties object to the empty table.
table.AppendChild<TableProperties>(tblProp);
Le code crée une ligne de tableau. Cette section du code utilise largement les méthodes surchargées Append , dont héritent les classes dérivées OpenXmlElement
. Les Append
méthodes permettent d’ajouter un élément unique ou d’ajouter une partie d’une arborescence XML à la fin de la liste des éléments enfants sous un élément parent donné. Ensuite, le code crée un TableCell objet, qui représente une cellule de tableau individuelle, et spécifie la propriété width de la cellule de tableau à l’aide d’un TableCellProperties objet, et le contenu de la cellule (« Hello, World ! ») à l’aide d’un Text objet .
Dans le schéma Wordprocessing Open XML, un élément de paragraphe (<p\>
) contient des éléments run (<r\>
) qui, à leur tour, contiennent des éléments de texte (<t\>
). Pour insérer du texte dans une cellule de tableau à l’aide de l’API, vous devez créer un Paragraph objet qui contient Run un Text
objet qui contient le texte que vous souhaitez insérer dans la cellule.
Vous ajoutez ensuite l’objet Paragraph
à l’objet TableCell
. Ceci crée la structure XML correcte pour l’insertion du texte dans la cellule. Est TableCell
ensuite ajouté à l’objet TableRow .
// Create a row.
TableRow tr = new TableRow();
// Create a cell.
TableCell tc1 = new TableCell();
// Specify the width property of the table cell.
tc1.Append(new TableCellProperties(
new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2400" }));
// Specify the table cell content.
tc1.Append(new Paragraph(new Run(new Text("some text"))));
// Append the table cell to the table row.
tr.Append(tc1);
Le code crée ensuite une seconde cellule de tableau. La dernière section du code crée une autre cellule de table à l’aide du constructeur surchargé TableCell
qui prend la OuterXml propriété d’un objet existant TableCell
comme seul argument.TableCell(String) Après avoir créé la deuxième cellule de tableau, le code ajoute le à l’objet TableRow
, ajoute le TableRow
à et Table
le Table
à l’objet Document .TableCell
// Create a second table cell by copying the OuterXml value of the first table cell.
TableCell tc2 = new TableCell(tc1.OuterXml);
// Append the table cell to the table row.
tr.Append(tc2);
// Append the table row to the table.
table.Append(tr);
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Append the table to the document.
doc.MainDocumentPart.Document.Body.Append(table);
Exemple de code
L'exemple de code suivant montre comment créer un tableau, définir ses propriétés, insérer du texte dans une cellule du tableau, copier une cellule, puis insérer le tableau dans un document de traitement de texte. Vous pouvez appeler la méthode CreateTable
à l’aide de l’appel suivant.
string filePath = args[0];
CreateTable(filePath);
Après avoir exécuté le programme, inspectez le fichier pour voir la table insérée.
Voici un exemple de code complet en C# et Visual Basic.
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
// Insert a table into a word processing document.
static void CreateTable(string fileName)
{
// Use the file name and path passed in as an argument
// to open an existing Word document.
using (WordprocessingDocument doc = WordprocessingDocument.Open(fileName, true))
{
// Create an empty table.
Table table = new Table();
// Create a TableProperties object and specify its border information.
TableProperties tblProp = new TableProperties(
new TableBorders(
new TopBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new BottomBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new LeftBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new RightBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new InsideHorizontalBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
},
new InsideVerticalBorder()
{
Val =
new EnumValue<BorderValues>(BorderValues.Dashed),
Size = 24
}
)
);
// Append the TableProperties object to the empty table.
table.AppendChild<TableProperties>(tblProp);
// Create a row.
TableRow tr = new TableRow();
// Create a cell.
TableCell tc1 = new TableCell();
// Specify the width property of the table cell.
tc1.Append(new TableCellProperties(
new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2400" }));
// Specify the table cell content.
tc1.Append(new Paragraph(new Run(new Text("some text"))));
// Append the table cell to the table row.
tr.Append(tc1);
// Create a second table cell by copying the OuterXml value of the first table cell.
TableCell tc2 = new TableCell(tc1.OuterXml);
// Append the table cell to the table row.
tr.Append(tc2);
// Append the table row to the table.
table.Append(tr);
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Append the table to the document.
doc.MainDocumentPart.Document.Body.Append(table);
}
}