使用NPOI批量读取docx文件时遇SettingsDocument解析失败及ObjectDisposedException
解决NPOI读取docx时的SettingsDocument解析失败与文件已关闭异常
问题场景
代码片段:
using (FileStream readStream = File.OpenRead(filePath)){ bool test = readStream.CanRead; document = new XWPFDocument(readStream); }
批量读取多个docx文件时,部分文件触发SettingsDocument parse failed错误,同时抛出System.ObjectDisposedException,提示“无法访问已关闭的文件”,异常发生在new XWPFDocument(readStream)执行阶段。
解决思路与方案
- 避免文件流提前释放:
using块会在代码块结束后自动关闭文件流,但XWPFDocument内部可能未完成对流的读取操作,导致后续访问时流已关闭。可以先将文件内容读取到内存流中,再传入XWPFDocument:byte[] fileBytes = File.ReadAllBytes(filePath); using (MemoryStream ms = new MemoryStream(fileBytes)) { document = new XWPFDocument(ms); // 执行document的相关处理逻辑 } - 处理损坏文件:部分docx文件本身存在格式损坏(如Settings.xml节点异常),导致NPOI解析失败。可以手动用Word打开并修复这类文件,或者在代码中增加异常捕获,跳过损坏文件:
foreach (var filePath in targetFilePaths) { try { byte[] fileBytes = File.ReadAllBytes(filePath); using (MemoryStream ms = new MemoryStream(fileBytes)) { var document = new XWPFDocument(ms); // 处理文档逻辑 } } catch (Exception ex) { Console.WriteLine($"文件{filePath}处理失败:{ex.Message}"); // 记录日志或直接跳过 continue; } } - 升级NPOI版本:旧版本NPOI对某些docx格式的支持存在缺陷,尝试升级到最新稳定版的NPOI NuGet包,大概率能修复这类解析bug。
内容的提问来源于stack exchange,提问作者birddish
相关产品推荐
相关产品推荐

