C# 使用NPOI生成Word文档(按照模板)

互联网 18-8-7

本篇包括生成Word对word文本的操作,表格的操作,以及图片的操作,都为生成word基础的一些操作。

以下只是我的个人理解所得,大家有什么更好的想法欢迎补充。

VS2017、右键解决方案,管理NuGet程序包,搜索并为项目安装NPOI程序包,并引用: using NPOI.XWPF.UserModel; 本编使用NPOI版本为2.3.0 下面进入正题·· 一、 获取模板(XWPFDocument doc) 使用模板,首先获取模板,然后把获取的模板实例化为NPOI的文档对象进行编辑操作: using (FileStream stream = File.OpenRead(“模板文件地址”)){ XWPFDocument doc = new XWPFDocument(stream); //处理doc,代码控制编辑文档。 } 处理doc后,生成新的文件,写入doc ,生成word完成。 FileStream file = new FileStream(生成文件路径+文件名, FileMode.Create, FileAccess.Write); doc.Write(file); file.Close(); doc就是我们获取到的模板的所有内容。 还有一点本编使用模板均为docx后缀文件,doc修改docx读取报错,需要另存为doxc文档。 二、 文本处理(XWPFParagraph para) doc.Paragraphs 获取到文档里的所有的段落对象; para.ParagraphText 获取段落的文本数据; para.ReplaceText(要被替换的文本,替换文本) 替换段落的文本(模板能实现的关键)

XWPFParagraph的官方参考文档

三、 表格处理(XWPFTable table) doc.Tables 获取文档里的所有的表格对象; 这里有必要多一嘴,doc.Tables获取的只是Word中最外层的表格,不包含嵌套内层的。 获取嵌套单元格可使用cell.Tables; (一) 表格行处理(XWPFTableRow row) row.Rows 获取表格所有行; (二) 表格单元格处理(XWPFTableCell cell) row.GetTableICells() ;获取表格行的所有单元格; 获取到单元格之后就可以获取单元格里的文本段落(Paragraphs)并且进行文本替换 (三) 水平合并行单元格

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

(四) 垂直合并列单元格

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

四、 图片处理 2.3.0版本的NPOI的图片插入没有集成xml文件的修改所以需要手写代码编入(当然,我是拷过来的)。

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

今天先到这了,以后有收获再补充。

使用C/C++编写PHP Extension

【c#教程】C# 数据类型

以上就是C# 使用NPOI生成Word文档(按照模板)的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: NPOI
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:VS2015新建一个完整的c++工程详细步骤

相关资讯