0

0

C#怎么动态生成Word文档_C#如何运用OpenXML【实战】

冰火之心

冰火之心

发布时间:2026-03-18 13:19:35

|

814人浏览过

|

来源于php中文网

原创

用 DocumentFormat.OpenXml 创建空白 Word 文档需调用 WordprocessingDocument.Create(),手动添加 MainDocumentPart,构造 Paragraph 时必须包含 ParagraphProperties、Run 和 Text 三层嵌套,表格须嵌入 Paragraph 内并确保 TableCell 包含 Paragraph,图片插入需匹配 ImagePartType 与文件类型且使用绝对路径,所有操作后须调用 Close() 或 using 块释放句柄。

DocumentFormat.OpenXml 创建空白 Word 文档,别碰 Microsoft.Office.Interop.Word

interop 本质是启动 word 进程,本地没装 office 就直接崩,服务器环境几乎不可用。openxml 是纯 .net 库,操作 zip 包里的 xml,无依赖、可部署、能批量。

安装 NuGet 包:DocumentFormat.OpenXml(注意不是 OpenXMLSDK 旧版)。

  • 新建文档必须调用 WordprocessingDocument.Create(),传入文件路径和 DocumentFormat.OpenXml.WordprocessingDocumentType.Document
  • 必须手动创建 MainDocumentPart 并调用 AddMainDocumentPart(),否则保存后 Word 打不开,报“文件已损坏”
  • 写完内容后一定要调用 document.Close() 或用 using 块,否则文件句柄未释放,下次写入会提示“进程无法访问该文件”

插入段落和文字:别直接 new Paragraph() 就完事

OpenXML 不是“加个控件”,而是拼 XML 节点。一个段落至少要包含 ParagraphProperties + Run + Text 三层嵌套,缺一层 Word 就拒绝解析。

常见错误现象:DocumentFormat.OpenXml.OpenXmlPackageException: The element has invalid child element —— 多半是漏了 RunParagraphProperties

  • 推荐用 new Paragraph(new ParagraphProperties(), new Run(new Text("hello"))) 显式构造
  • 如果要居中/加粗/换字体,改的是 ParagraphPropertiesRunProperties,不是 Text 本身
  • Text 构造函数里传的字符串会原样写入 XML,中文不用额外编码,但 <>& 会被自动转义,无需手动处理

表格怎么加?Table 必须嵌在 Paragraph 里,且要有 TableRowTableCell

OpenXML 表格不是独立容器,它本质上是一段“特殊段落”。直接把 Table 加到 Body 下,Word 会忽略整张表。

典型结构链路:Body → Paragraph → Table → TableRow → TableCell → Paragraph → Run → Text。少任何一环都显示为空白或报错。

Buildt.ai
Buildt.ai

AI驱动的软件开发平台,可以自动生成代码片段、代码分析及其他自动化任务

下载
  • 每个 TableCell 必须包裹至少一个 Paragraph,哪怕只放空段落也要写上
  • 合并单元格靠 GridSpan(列合并)和 VMerge(行合并),不是靠设置宽度;VMergeVal 值必须是 VMergeValues.Restart(首行)或 VMergeValues.Continue(后续行)
  • 表格样式(如边框)由 TableProperties 控制,但默认无边框;想显示边框得显式设置 TableBorders,否则导出后是“隐形表”

图片插入失败?ImagePartBlip 要配对,且路径必须是绝对路径

OpenXML 不支持直接读取相对路径或流对象。你传进去的图片路径,必须是运行时能真实访问到的绝对路径(比如 C:\temp\logo.png),否则抛 FileNotFoundException

更隐蔽的坑:图片插入后 Word 不显示,但也不报错——大概率是 ImagePartContentType 和实际文件类型不匹配(比如 PNG 用了 image/jpeg)。

  • document.MainDocumentPart.AddImagePart(ImagePartType.Jpeg) 时,ImagePartType 必须严格对应文件扩展名(PngJpegGif
  • 插入后要手动关联 BlipImagePartId,通过 mainPart.GetIdOfPart(imagePart) 获取,不能硬编码
  • 图片尺寸控制靠 Extent(EMUs 单位),1 英寸 = 914400 EMUs;直接设像素会失真,建议先按比例换算

复杂点在于:所有部件(文本、表格、图片)的顺序和嵌套层级,本质是 XML 树结构。写错一层,轻则样式丢失,重则整个文档打不开。调试时别只看 C# 代码,用 dotnet tool install -g openxmlsdk 安装 SDK 工具,用 openxmlsdk show xxx.docx 拆包看实际 XML,比猜快得多。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1950

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2120

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1180

2024.11.28

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

262

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1571

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

652

2023.11.24

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

3

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号