Open XML SDK 是微软官方 .NET 类库,用于直接读写 Office Open XML 文件(如 .docx),不依赖 Word 应用程序;通过强类型对象模型(如 Document、Paragraph)操作内容,自动处理 XML 序列化与包结构;需安装 DocumentFormat.OpenXml NuGet 包,创建文档须手动添加 MainDocumentPart 并初始化 Document 根元素;插入文本需按 Body→Paragraph→Run→Text 层级构建对象树后 Append;修改现有文档可遍历 Text 元素赋值;直触 XML 时须注意命名空间和流操作规范;每次操作后须调用 Close() 或使用 using 确保资源释放。

Open XML SDK 是微软提供的用于操作 Office Open XML 文件(如 .docx、.xlsx、.pptx)的官方 .NET 类库。它不依赖 Word 应用程序,而是直接读写底层 ZIP 封装内的 XML 内容,性能高、可控性强。用 C# 操作 Word 文档的 XML,本质是通过 SDK 提供的强类型对象模型(如 Document、Paragraph、Run 等)来增删改查内容,SDK 自动处理底层 XML 序列化与包结构(如 document.xml、rels、styles.xml 等)。
安装 Open XML SDK 并创建基础文档
在项目中安装 NuGet 包:DocumentFormat.OpenXml(最新稳定版,如 3.0+)。注意:.NET 6/7/8 项目推荐使用该包;旧版 OpenXML SDK 2.5 已停止更新,且需额外安装运行时。
- 新建空白 .docx:用
WordprocessingDocument.Create()创建新文件,指定WordprocessingDocumentType.Document - 必须手动添加主文档部件(
MainDocumentPart),再通过AddMainDocumentPart()获取引用 - 调用
MainDocumentPart.Document = new Document()初始化根元素,否则后续操作会抛异常
向文档插入文本与段落
所有内容都封装在 Body → Paragraph → Run → Text 的层级中。SDK 不直接编辑原始 XML 字符串,而是构建对象树后保存。
- 获取
Body:通过mainPart.Document.Body ??= new Body()确保存在 - 新建段落:
var para = new Paragraph(new Run(new Text("Hello, World!"))) - 追加到文档:
body.Append(para)(注意不是AppendChild,这是常见误区) - 支持格式:可在
Run中添加RunProperties设置字体、加粗、颜色等
读取并修改现有文档中的文本
打开已有 .docx 时用 WordprocessingDocument.Open(path, isEditable: true)。读取文本需遍历 Paragraph 和 Text 元素。
- 获取所有文本节点:
doc.MainDocumentPart.Document.Body.Descendants() - 修改内容:
textNode.Text = "New content"(直接赋值即可,SDK 会在 Save() 时同步) - 注意:不要直接修改
InnerText或手动拼接 XML 字符串——这会破坏命名空间和结构,SDK 会忽略或报错 - 若需定位特定段落(如含某关键词),可用 LINQ 配合
InnerText或GetText()辅助方法
访问底层 XML 进行高级定制
虽然 SDK 推荐使用对象模型,但某些场景(如插入自定义 XML 部件、修改页眉页脚复杂结构、调试)需要直触 XML。
- 获取原始 XML 字符串:
mainPart.GetStream().ReadAllText()(仅用于查看,不可直接修改后写回) - 安全方式:用
mainPart.Document.Save(mainPart.GetStream())保存对象树;若需注入自定义 XML 片段,应通过OuterXml属性或XmlDocument加载后插入节点(需严格匹配命名空间) - 常用命名空间前缀:
w:(wordprocessingML)、r:(relationships)、mc:(markup compatibility)——SDK 对象已自动处理,手动操作 XML 时必须显式声明
不复杂但容易忽略:每次修改后必须调用 document.Close() 或使用 using 语句释放资源,否则文件可能被锁住或内容未写入磁盘。










