Home >Backend Development >C#.Net Tutorial >C# uses NPOI to generate Word documents (according to template)

C# uses NPOI to generate Word documents (according to template)

php是最好的语言
php是最好的语言Original
2018-08-07 10:52:3616916browse

The project needs to integrate word export. When I was doing it, there were not many online document resources and it was quite messy, so I checked, sorted it out, made a record, and also shared some basic operations of NPOI operating Word documents with those in need. friend.

This article includes the operations of generating Word text, table operations, and picture operations, which are all basic operations for generating Word.

The following is just my personal understanding. If you have any better ideas, please feel free to add.

VS2017, right-click the solution, manage NuGet packages, search and install the NPOI package for the project, and quote:
using NPOI.XWPF.UserModel;
This article uses the NPOI version For 2.3.0
Let’s get to the point··
1. Get the template (XWPFDocument doc)
Use the template, first get the template, and then instantiate the obtained template as Edit the document object of NPOI:
using (FileStream stream = File.OpenRead("template file address")){
XWPFDocument doc = new XWPFDocument(stream);
//Process doc, code control editing document.
}
After processing the doc, generate a new file, write it into the doc, and complete the word generation.
FileStream file = new FileStream(generated file path file name, FileMode.Create, FileAccess.Write);
doc.Write(file);
file.Close();
doc is what we get to all contents of the template.
Another point is that the templates used by this editor are all docx suffix files. If doc is modified, an error will be reported when reading docx, and it needs to be saved as a doxc document.
2. Text processing (XWPFParagraph para)
doc.Paragraphs Gets all the paragraph objects in the document;
para.ParagraphText Gets the text data of the paragraph;
para.ReplaceText (text to be replaced, replacement text) Replace the text of the paragraph (the key to template implementation)

Official reference document of XWPFParagraph

3. Table processing ( XWPFTable table)
doc.Tables Gets all table objects in the document;
It is necessary to say more here, doc.Tables only gets the outermost table in Word, not including the nested ones layer.
You can use cell.Tables to get nested cells;
(1) Table row processing (XWPFTableRow row)
row.Rows Get all the rows of the table;
(2) Table cell processing (XWPFTableCell cell)
row.GetTableICells() ; Get all the cells in the table row;
After getting the cell, you can get the cell Text paragraphs (Paragraphs) in and perform text replacement
(3) Merge row cells horizontally

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

(4) Merge column cells vertically

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;//垂直
}

4. Image processing
The image insertion of the NPOI version 2.3.0 does not integrate the modification of the xml file, so it needs to be compiled by handwriting (of course, I copied it).

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;
}

I’ll stop here today, and I’ll add more later if I gain more.

Related recommendations:

Write PHP Extension using C/C

[c# tutorial]C# data type

The above is the detailed content of C# uses NPOI to generate Word documents (according to template). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn