1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C# NPOI生成Word文档(模板)

C# NPOI生成Word文档(模板)

时间:2020-12-30 05:35:36

相关推荐

C# NPOI生成Word文档(模板)

项目需要集成word导出,做的时候网上文档资源不是很多,也比较杂乱,所以查了查,整理了整理,做个记录,也顺便把NPOI操作Word文档的一些基本操作分享给有需要的朋友。

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

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

VS、右键解决方案,管理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=\"/drawingml//picture\" xmlns:a=\"/drawingml//main\">"+ " <pic:nvPicPr>" + " <pic:cNvPr id=\""+ "0"+ "\" name=\"Generated\"/>"+ " <pic:cNvPicPr/>"+ " </pic:nvPicPr>"+ " <pic:blipFill>"+ " <a:blip r:embed=\""+ id+ "\" xmlns:r=\"/officeDocument//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 = "/drawingml//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;}

五、页眉页脚处理

这部分也是在网路各个大神那里参考搬来的,有些许改动并添加了对齐方式,谨慎参考,积极批评。

doc.Document.body.sectPr = new CT_SectPr();CT_SectPr m_SectPr = doc.Document.body.sectPr;//创建页眉CT_Hdr m_Hdr = new CT_Hdr();CT_P m_P = m_Hdr.AddNewP();m_P.AddNewR().AddNewT().Value ="页眉内容值"; m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 页眉居中//创建页眉关系(headern.xml)XWPFRelation Hrelation = XWPFRelation.HEADER;XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1);doc.CreateFootnotes();//设置页眉m_h.SetHeaderFooter(m_Hdr);CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference();m_HdrFtr.type = ST_HdrFtr.@default;m_HdrFtr.id = m_h.GetPackageRelationship().Id;//创建页脚CT_Ftr m_ftr = new CT_Ftr();CT_P m_fP = m_ftr.AddNewP();m_fP.AddNewR().AddNewT().Value = "页脚内容值";m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 页眉居中//创建页脚关系(footern.xml)XWPFRelation Frelation = XWPFRelation.FOOTER;XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1);//设置页脚m_f.SetHeaderFooter(m_ftr);m_HdrFtr = m_SectPr.AddNewFooterReference();m_HdrFtr.type = ST_HdrFtr.@default;m_HdrFtr.id = m_f.GetPackageRelationship().Id;

六、创建word文件,将doc内容写入文档,导出完成。

FileStream file = new FileStream(savePath, FileMode.Create, FileAccess.Write);doc.Write(file);file.Close();

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。