C#上传后读取Docx文件内容及部署后读取失败问题排查
读取Docx内容有几种实用方案,你可以根据场景选择:
Open XML SDK(官方推荐,无Office依赖)
这是微软官方推出的库,专门处理Office开放格式文件,完全不需要目标机器安装Office客户端,非常适合服务器部署场景。先通过NuGet安装DocumentFormat.OpenXml包,再通过遍历文档的段落、文本块来提取内容。第三方简化库(比如DocX)
如果你想写更简洁的代码,Xceed.Document.NET(NuGet包)封装了OpenXML的复杂操作,API更直观友好,能快速实现文本提取。Microsoft.Office.Interop.Word(不推荐服务器环境)
就是你代码里用的方式,它依赖本地安装的Office客户端,在个人电脑上能正常运行,但部署到服务器会有诸多权限、稳定性问题,不建议在生产环境使用。
你的代码基于Microsoft.Office.Interop.Word,本地能跑是因为你的电脑装了Office,且当前用户有足够权限访问Office组件,但部署到服务器后出问题,大概率是这几个原因:
服务器未安装Microsoft Office
Interop完全依赖Office的COM组件,服务器没装的话直接报错。哪怕装了Office,微软也明确说明Interop不支持服务器端自动化,会存在内存泄漏、进程僵死等隐患。应用池权限不足
IIS默认的应用池身份(比如ApplicationPoolIdentity)没有权限启动Office进程,也无法访问Office的COM组件资源。Office与应用程序架构不匹配
比如你的应用是64位,但服务器装了32位Office,会出现组件找不到的情况;反之亦然。
替代解决方案:改用Open XML SDK代码
放弃Interop,换成无依赖的Open XML SDK,服务器不需要装Office,稳定性和性能都更可靠。给你写个替代示例:
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System.Text; public static string GetTextFromWord(string filePath) { StringBuilder textBuilder = new StringBuilder(); using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filePath, false)) { Body body = wordDoc.MainDocumentPart.Document.Body; foreach (var paragraph in body.Elements<Paragraph>()) { foreach (var run in paragraph.Elements<Run>()) { foreach (var text in run.Elements<Text>()) { textBuilder.Append(text.Text); } textBuilder.Append(" "); } textBuilder.AppendLine(); } } return textBuilder.ToString().Trim(); }
额外提示
先通过NuGet安装对应.NET版本的DocumentFormat.OpenXml包,这段代码会遍历文档的所有段落和文本块,提取纯文本内容,部署到服务器后无需额外配置即可运行。
内容的提问来源于stack exchange,提问作者Deepak Krishna R

