C# 使用NPOI生成Word文档(按照模板)
项目需要集成word导出,做的时候网上文档资源不是很多,也比较杂乱,所以查了查,整理了整理,做个记录,也顺便把NPOI操作Word文档的一些基本操作分享给有需要的朋友。
本篇包括生成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++实现文本路径生成
- C#如何绘制PDF嵌套表格?绘制PDF嵌套表格的步骤
- C++实现逐行读取txt文件中的字符串以及文件文本的复制
- c语言中文本输出的函数名称是什么?
- golang读取文本乱码解决方法
- Go语言使用正则表达式提取网页文本
- 使用CSS样式表格式化XML文档的详情介绍
- XSL将XML中的CDATA注释输出为HTML文本的代码实例
- TensorFlow Bi-LSTM实现文本分词