C#使用NPOI生成Word文档的方法
在此我们介绍以模板载入内容导出Word文档的方式
一、获取模板(XWPFDocument doc)
1.首先获取模板,然后把获取的模板实例化为NPOI的文档对象进行操作:
FileStream stream = File.OpenRead("模板文件地址") //FileStream stream = new FileStream("模板文件地址", FileMode.Open, FileAccess.Read) XWPFDocument myDoc = new XWPFDocument(stream);
2.处理doc,代码控制编辑文档
//遍历段落,替换内容
foreach (var para in myDoc.Paragraphs)
{
//替换文字
ExtensionHelper.ExtensionHelper.ReplaceKey(实体对象, para);
//替换图片
if (para.ParagraphText.Contains("QyslPic"))//图片占位文本
{
para.ReplaceText(para.ParagraphText, string.Empty);
XWPFRun newRrun = para.CreateRun();
using (FileStream fsImg = new FileStream("图片地址", FileMode.Open, FileAccess.Read))
{
newRrun.AddPicture(fsImg, 11, "图片地址", 520 * 9525, 269 * 9525);
}
para.Alignment = ParagraphAlignment.CENTER;
}
}
//遍历table,替换单元格内容
foreach (var table in myDoc.Tables)
{
foreach (var row in table.Rows)
{
foreach (var cell in row.GetTableCells())
{
foreach (var para in cell.Paragraphs)
{
//替换文字
ExtensionHelper.ExtensionHelper.ReplaceKey(实体对象, para);
}
}
}
}
3.处理doc后,生成新的文件,写入doc ,生成word完成;doc就是我们获取到的模板的所有内容。
FileStream file = new FileStream("生成文件新路径+文件名", FileMode.Create, FileAccess.Write); doc.Write(file); file.Close();
4.替换文字方法
/// <summary> /// word模板内容替换 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="etity">实体数据</param> /// <param name="para">段落</param> public static void ReplaceKey<T>(T etity, XWPFParagraph para) { Type entityType = typeof(T); PropertyInfo[] properties = entityType.GetProperties();
var runs = para.Runs;
string text = ""; foreach (var run in runs) { text = run.ToString(); foreach (var p in properties) { string propteryName = p.Name;//Word模板中设定的需要替换的标签 object value = p.GetValue(etity); if (value == null) { value = ""; } if (text.Contains(propteryName)) { text = text.Replace(propteryName, value.ToString()); } run.SetText(text);//替换标签文本(重要) } } }
二、文本处理(XWPFParagraph para)
doc.Paragraphs 获取到文档里的所有的段落对象;
para.ParagraphText 获取段落的文本数据;
para.ReplaceText(要被替换的文本,替换文本) 替换段落的文本(模板能实现的关键)
三、表格处理
1. 获取处理(XWPFTable table)
doc.Tables:获取文档里的所有的表格对象,doc.Tables获取的只是Word中最外层的表格,不包含嵌套内层的。获取嵌套单元格可使用cell.Tables;
2. 表格行处理(XWPFTableRow row)
row.Rows:获取表格所有行;
3. 表格单元格处理(XWPFTableCell cell)
row.GetTableICells():获取表格行的所有单元格;获取到单元格之后就可以获取单元格里的文本段落(Paragraphs)并且进行文本替换
四、插入图表
图表插入暂时未研究,欢迎各位大神指教补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)