Maison  >  Article  >  développement back-end  >  C# utilise NPOI pour générer des documents Word (selon le modèle)

C# utilise NPOI pour générer des documents Word (selon le modèle)

php是最好的语言
php是最好的语言original
2018-08-07 10:52:3616855parcourir

Le projet doit intégrer l'exportation de mots. Lorsque je le faisais, il n'y avait pas beaucoup de ressources documentaires en ligne et c'était assez compliqué, j'ai donc vérifié, trié et enregistré, j'ai également partagé quelques opérations de base du fonctionnement de NPOI avec Word. documents avec ceux qui en ont besoin.

Cet article comprend les opérations de génération de texte Word, les opérations sur les tableaux et les opérations sur les images, qui sont toutes des opérations de base pour générer Word.

Ce qui suit n'est que ma compréhension personnelle. Si vous avez de meilleures idées, n'hésitez pas à les ajouter.

VS2017, cliquez avec le bouton droit sur la solution, gérez les packages NuGet, recherchez et installez le package NPOI pour le projet et citez :
en utilisant NPOI.XWPF.UserModel
Cet article utilise ; la version NPOI Pour 2.3.0
Allons au point··
1 Récupérez le modèle (doc XWPFDocument)
Utilisez le modèle, récupérez d'abord le modèle, puis instanciez le modèle obtenu en tant que Modifier l'objet document de NPOI :
en utilisant (FileStream stream = File.OpenRead("adresse du fichier modèle")){
XWPFDocument doc = new XWPFDocument(stream); // Document de processus, document d'édition de contrôle de code.
}
Après avoir traité le document, générez un nouveau fichier, écrivez-le dans le document et terminez la génération de mots.
FileStream file = new FileStream(Générer le chemin du fichier + nom du fichier, FileMode.Create, FileAccess.Write);
doc.Write(file);
file.Close(); Obtenez tout le contenu du modèle.

Un autre point est que les modèles utilisés par cet éditeur sont tous des fichiers de suffixe docx. Si le doc est modifié, une erreur sera signalée lors de la lecture du docx, et il doit être enregistré en tant que document doxc.
2. Traitement du texte (XWPFParagraph para)
doc.Paragraphs Récupère tous les objets de paragraphe du document para.ParagraphText Récupère les données texte du paragraphe ; 🎜 >para.ReplaceText (texte à remplacer, texte de remplacement) Remplacer le texte du paragraphe (la clé de la mise en œuvre du modèle)

Document de référence officiel de XWPFParagraph

3. traitement ( ( couche.

Vous pouvez utiliser cell.Tables pour obtenir des cellules imbriquées ;

(1) Traitement des lignes du tableau (ligne XWPFTableRow)
row.Rows Obtenez toutes les lignes du tableau ;
(2) Traitement des cellules du tableau (cellule XWPFTableCell)

Obtenez toutes les cellules de la ligne du tableau Après avoir obtenu la cellule, vous pouvez obtenir les paragraphes de texte (Paragraphes) dans le cellule et effectuez le remplacement du texte

(3) Fusionner les cellules de ligne horizontalement
row.GetTableICells()   ;
(4) Fusionner les cellules de colonne verticalement

CT_Tc cttcofRowThird = cell.GetCTTc();
CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr();
ctProfRowThird.gridSpan = new CT_DecimalNumber();
ctProfRowThird.gridSpan.val = num.ToString();//合并num列
4. Traitement des images

L'insertion d'images de la version 2.3.0 de NPOI n'intègre pas la modification du fichier xml, elle nécessite donc du code manuscrit (bien sûr, je l'ai copié).

List<XWPFTableRow> rows所有要合并的行的XWPFTableRow对象集合。

XWPFTableCell cellFirstofThird = 第一行要合并的单元格对象;
CT_Tc cttcFirstofThird = cellFirstofThird.GetCTTc();
CT_TcPr ctPrFirstofThird = cttcFirstofThird.AddNewTcPr();
ctPrFirstofThird.AddNewVMerge().val = ST_Merge.restart;//开始合并行
ctPrFirstofThird.AddNewVAlign().val = ST_VerticalJc.center;//垂直
cttcFirstofThird.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
for (int i = 1; i < rows.Count; i++)
{
    XWPFTableCell cellfirstofRow = 第i行要合并的单元格对象;
    CT_Tc cttcfirstofRow = cellfirstofRow.GetCTTc();
    CT_TcPr ctPrfirstofRow = cttcfirstofRow.AddNewTcPr();
    ctPrfirstofRow.AddNewVMerge().val = ST_Merge.@continue;//继续合并行
    ctPrfirstofRow.AddNewVAlign().val = ST_VerticalJc.center;//垂直
}
Je m'arrêterai ici aujourd'hui, j'en ajouterai plus plus tard si j'en gagne plus.

Recommandations associées :

using (FileStream fsImg = new FileStream(图片路径, FileMode.Open, FileAccess.Read, FileShare.None))
{
var picID = doc.AddPictureData(fsImg, (int)NPOI.XWPF.UserModel.PictureType.JPEG);
string picXml = ""
+ "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                    + "0"
                    + "\" name=\"Generated\"/>"
                    + "            <pic:cNvPicPr/>"
                    + "         </pic:nvPicPr>"
                    + "         <pic:blipFill>"
                    + "            <a:blip r:embed=\""
                    + id
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            <a:stretch>"
                    + "               <a:fillRect/>"
                    + "            </a:stretch>"
                    + "         </pic:blipFill>"
                    + "         <pic:spPr>"
                    + "            <a:xfrm>"
                    + "               <a:off x=\"0\" y=\"0\"/>"
                    + "               <a:ext cx=\""
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            </a:xfrm>"
                    + "            <a:prstGeom prst=\"rect\">"
                    + "               <a:avLst/>"
                    + "            </a:prstGeom>"
                    + "         </pic:spPr>"
                    + "      </pic:pic>";
                XWPFParagraph par = cell.AddParagraph();//创建段落对象(可以在doc加也可在cell加)
                par.Alignment = ParagraphAlignment.CENTER;//居中
                XWPFRun run = par.CreateRun();
                CT_Inline inline = run.GetCTR().AddNewDrawing().AddNewInline();
                inline.graphic = new CT_GraphicalObject
                {
                    graphicData = new CT_GraphicalObjectData
                    {
                        uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"
                    }
                };
                try
                {
                    inline.graphic.graphicData.AddPicElement(picXml);
                }
                catch (XmlException xe)
                {
                    throw xe;
                }
                NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D extent = inline.AddNewExtent();
                extent.cx = width;
                extent.cy = height;
                NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps docPr = inline.AddNewDocPr();
                docPr.id = 1;
                docPr.name = "Image" + id;
}
Écriture d'une extension PHP à l'aide de C/C++


[Tutoriel c#] Types de données C#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn