推荐用 documentformat.openxml 读取 .docx 文本,因其纯托管、无需 office 安装、支持跨平台;需用 using 正确释放 wordprocessingdocument,文本提取优先用 paragraph.innertext,注意排除 .doc 文件及被占用/路径错误等问题。

用 DocumentFormat.OpenXml 读取 .docx 文本最轻量可靠
直接依赖 Office COM(如 Microsoft.Office.Interop.Word)在无桌面环境或服务器上会失败,且启动慢、线程不安全。推荐用官方开源库 DocumentFormat.OpenXml —— 它纯托管、无需 Office 安装、支持 .NET Core / .NET 5+。
安装 NuGet 包:DocumentFormat.OpenXml(注意:不是 OpenXMLSDK 旧版)。
关键点:
-
WordprocessingDocument必须用using正确释放,否则文件句柄可能被锁 - 文本分散在
Text元素中,常嵌套在Run→Text或Paragraph→Run→Text结构里 - 忽略
TabChar、CarriageReturn等非显示字符,但保留段落间换行逻辑
using (var doc = WordprocessingDocument.Open(@"C:\test.docx", false))
{
var body = doc.MainDocumentPart.Document.Body;
var paragraphs = body.Elements<Paragraph>();
string fullText = string.Join("\n", paragraphs
.Select(p => p.InnerText.Trim())
.Where(t => !string.IsNullOrEmpty(t)));
}
InnerText 和手动遍历 Text 元素的区别在哪
Paragraph.InnerText 是 Open XML SDK 提供的便捷属性,它会递归提取所有后代 Text 节点内容并拼接,自动跳过空格、制表符等格式节点 —— 大多数纯文本提取场景够用。
但如果你需要:
- 保留粗体/斜体等样式标记(比如加
[B]前缀)→ 必须手动遍历Run+ 检查RunProperties - 跳过页眉页脚/文本框/注释中的内容 →
InnerText会一并包含,需改用Document.Body显式限定范围 - 处理含复杂嵌套(如表格内段落)→
InnerText可能丢换行或合并相邻段落,此时要单独处理Table和TableRow
遇到“无法打开文件”或“文件损坏”错误怎么办
常见原因不是代码问题,而是文件本身或路径陷阱:
- 传入的是 .doc(非 .docx)→
DocumentFormat.OpenXml**完全不支持** 二进制 Word 97–2003 格式 - 文件正被 Word 进程占用(即使界面已关)→ 报错
System.IO.IOException: The process cannot access the file - 路径含中文或特殊符号但未正确转义 → 检查
@""字符串或使用Path.GetFullPath() - 文件实际是 ZIP 压缩包但扩展名被误改为 .docx → 用 7-Zip 打开确认根目录有
[Content_Types].xml
调试建议:先用 File.ReadAllBytes(path).Length 确认文件可读且大小合理(空 .docx 通常 > 2KB)。
要不要用 Microsoft.Office.Interop.Word?
仅当必须保留原文档布局、渲染效果(如分栏、精确字体大小)、或需操作宏/OLE 对象时才考虑。但它带来严重限制:
- Windows 专属,不能跑在 Linux/macOS 或 Azure App Service
- 每次调用都启动隐藏 Word 进程,内存泄漏风险高,IIS 下极易卡死
- 需要目标机器安装对应版本 Office,且许可合规性存疑
- 64 位进程调用 32 位 interop dll 会报
BadImageFormatException
真正需要“所见即所得”导出的场景,应转向生成 PDF 或用 Aspose.Words(商业库),而非 Interop。
Open XML 方案看似底层,但对纯文本提取来说,稳定性和可控性远超 COM 互操作 —— 尤其当文档结构简单、你只关心“人眼看到的字”时。










