如何基于.NET Core在服务器端修改Word内容控件?
在.NET Core服务器端设置Word内容控件内容的实现方案
由于NPOI仅支持内容控件的只读访问,推荐使用Open XML SDK for .NET(微软官方开源库)或封装后的Xceed.Document.NET库来实现读写操作,以下是具体方案:
方案一:使用Open XML SDK(官方推荐)
这是微软针对Office Open XML格式的原生操作库,完全支持.NET Core,功能完整且无授权限制。
1. 安装NuGet包
通过.NET CLI安装:
dotnet add package DocumentFormat.OpenXml
2. 核心代码示例
以下代码通过内容控件的Tag属性定位目标控件,并修改其内容:
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; public void UpdateContentControl(string docFilePath, string controlTag, string newContent) { // 以可写模式打开Word文档 using (var wordDoc = WordprocessingDocument.Open(docFilePath, true)) { var mainPart = wordDoc.MainDocumentPart; var doc = mainPart.Document; // 遍历所有内容控件,匹配指定Tag var targetControl = doc.Descendants<SdtElement>() .FirstOrDefault(sdt => sdt.SdtProperties?.GetFirstChild<Tag>()?.Val == controlTag); if (targetControl == null) return; // 清空控件原有内容 targetControl.SdtContent.RemoveAllChildren(); // 插入新内容(以纯文本段落为例) var paragraph = new Paragraph(); var run = new Run(new Text(newContent)); paragraph.Append(run); targetControl.SdtContent.Append(paragraph); // 保存修改 doc.Save(); } }
注意事项
- 不同类型的内容控件(如纯文本、富文本、下拉框)对应的
SdtContent子元素不同,需根据控件类型调整内容插入逻辑。例如纯文本控件可直接操作SdtContentText; - 若需更精准定位,可通过内容控件的
Id属性(SdtProperties下的Id元素)替代Tag,避免Tag重复的问题。
方案二:使用Xceed.Document.NET(简化开发)
该库封装了Open XML SDK,提供更简洁的API,适合快速开发场景(非商业项目可免费使用,商业项目需获取授权)。
1. 安装NuGet包
dotnet add package Xceed.Document.NET
2. 核心代码示例
using Xceed.Document.NET; public void UpdateContentControlWithDocX(string docFilePath, string controlTag, string newContent) { using (var document = DocX.Load(docFilePath)) { var targetControl = document.ContentControls.FirstOrDefault(cc => cc.Tag == controlTag); if (targetControl != null) { targetControl.Text = newContent; document.Save(); } } }
内容的提问来源于stack exchange,提问作者JacquesB
相关产品推荐
相关产品推荐

