不推荐在服务端使用Microsoft.Office.Interop.Word,应改用OpenXML SDK;仅限桌面应用且需手动释放资源;DOC格式无可靠生成方案,优先说服客户改用DOCX。

用 Microsoft.Office.Interop.Word 生成 Word 文档,真不推荐在服务端用
它依赖本地安装的 Word 应用程序,不能跨平台,服务端启动 Word.Application 实例极易卡死、内存泄漏,且微软明确不支持服务器端自动化。常见现象是:第一次调用正常,后续请求超时、进程残留、IIS 应用池崩溃。
实操建议:
- 仅限 Windows 桌面应用(如 WinForms/WPF)且用户明确装了 Office 的场景
- 必须手动调用
app.Quit()并置空引用,再加GC.Collect()强制回收(仍不保险) - 避免多线程共用同一个
Application实例——每个文档操作应独占实例并立即释放 - 若已在线上用了,务必监控
WINWORD.EXE进程数,设置自动清理脚本
用 OpenXML SDK 写 .docx,才是生产环境正解
它直接操作 Word 的底层 ZIP+XML 结构,零 Office 依赖、纯托管、可跨平台(.NET Core/.NET 5+),性能好、可控性强。但代价是:你得理解 document.xml 的节点逻辑,比如段落是 w:p、文本是 w:t、样式靠 w:styleId 关联。
实操建议:
- 从模板入手:用 Word 保存一个带样式的
.docx,后缀改为.zip解压,观察word/document.xml和word/styles.xml结构 - 用
DocumentFormat.OpenXml包(NuGet 安装DocumentFormat.OpenXml2.19+) - 别手写 XML;用
MainDocumentPart+Body+Paragraph+Run+Text链式构建,例如:var doc = new WordprocessingDocument(stream, FileMode.Create); var mainPart = doc.AddMainDocumentPart(); mainPart.Document = new Document(); var body = mainPart.Document.Append(new Body()); body.Append(new Paragraph(new Run(new Text("Hello")))); - 表格、图片、页眉页脚都需对应 Part(
TablePart、ImagePart、HeaderPart),漏掉AddPart()会报Cannot insert a duplicate part
用 DocX 或 NPOI 快速出简单文档,但得清楚它们的边界
DocX(Xceed.Words.NET)封装了 OpenXML,语法更接近 Word UI,适合快速生成含格式、表格、图片的文档;NPOI 主打 Excel,其 Word 支持(HWPF / XWPF)仅限读取和极简写入,不推荐用于生成新文档。
实操建议:
-
DocX适合中小项目原型或内部工具,NuGet 安装DocX,注意它不支持 .NET 6+ 的默认 TLS 版本(可能需显式设ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12) - 插入图片必须提供绝对路径或
byte[],相对路径会失败;插入表格后若要加边框,得逐个Cell设置Border,不是整表一键 -
NPOI.XWPF的XWPFDocument可新建,但不支持样式继承、目录、复杂分节,生成的文档打开时 Word 常提示“内容有问题”,修复后样式丢失 - 所有第三方库都不处理宏、ActiveX、OLE 对象——这类需求只能退回 Interop(并接受风险)
生成 DOC 而非 DOCX?基本没靠谱方案
旧版二进制 .doc 格式未公开规范,微软从未提供官方 .NET API 支持。OpenXML 只针对 .docx;Interop 虽能另存为 .doc,但依赖 Word 且质量不可控(字体替换、公式错位);NPOI.HWPF 仅支持读取,写入能力几乎为零且早已停止维护。
实操建议:
- 如果客户硬性要求
.doc,优先说服改用.docx(Office 2007+ 全系兼容,且是 ISO 标准) - 实在不行,用 Interop 打开模板
.doc,填内容,再调Document.SaveAs2(FileName: "x.doc", FileFormat: WdSaveFormat.wdFormatDocument)——但必须确保目标机器装的是完整版 Office(精简版不支持) - 切勿尝试用字节流拼接或逆向 HWPF,已有大量案例因结构微小偏差导致文档损坏且无法恢复


















