C#使用Microsoft.Office.Interop.Word统计Word文档行数问题
问题解决方案
你找不到Lines接口/属性的核心原因是该集合并非Document类的直接属性,而是隶属于分页后的Page对象,且需要文档完成排版重算后才能取到准确值。以下是两种可直接落地、统计结果和Word自带字数统计面板完全一致的实现方式:
方法1:直接调用内置统计方法(推荐,性能最好、准确率最高)
Word对象模型提供了ComputeStatistics内置方法,可直接返回指定维度的统计值,不需要遍历分页对象,是最稳定的实现方式,和你现有字数统计代码的适配成本最低。
你只需要将原有获取字数的逻辑替换为统计行数的枚举即可,对应枚举值wdStatisticLines就是文档总行数,第二个参数可控制是否统计脚注、尾注内的内容。
参考代码如下:
// 需先引入对应命名空间 using Microsoft.Office.Interop.Word; using System.Reflection; using System.Runtime.InteropServices; public int GetLinesCountFromWordFile(string wordFile) { Application application = null; Document document = null; object missing = Missing.Value; try { if (!File.Exists(wordFile)) return 0; application = new Application(); // 后台打开,不显示界面 application.Visible = false; document = application.Documents.Open( FileName: wordFile, ReadOnly: true, AddToRecentFiles: false, Visible: false ); // 核心:调用内置统计方法获取总行数,第二个参数对应是否统计脚注尾注,传false和Word默认统计口径一致 int lineCount = document.ComputeStatistics(WdStatistic.wdStatisticLines, ref missing); // 关闭文档,不保存更改 object saveChanges = WdSaveOptions.wdDoNotSaveChanges; document.Close(ref saveChanges, ref missing, ref missing); application.Quit(ref saveChanges, ref missing, ref missing); return lineCount; } catch (Exception ex) { LogWriter.ErrorLogWriter(nameof(Client), nameof(TaskHelper), nameof(GetLinesCountFromWordFile), "int", ex.Message); // 异常分支确保资源释放 if (document != null) { document.Close(WdSaveOptions.wdDoNotSaveChanges); Marshal.ReleaseComObject(document); } if (application != null) { application.Quit(WdSaveOptions.wdDoNotSaveChanges); Marshal.ReleaseComObject(application); } return 0; } }
方法2:通过分页Lines集合累加统计
如果你需要按页维度拆分统计行数,可以通过Panes -> Pages -> Lines的层级获取对应集合,注意必须先触发文档重排分页,否则返回的行数会存在偏差:
// 打开文档后先执行重分页 document.Repaginate(); int totalLines = 0; Panes panes = document.ActiveWindow.Panes; Pane firstPane = panes[1]; Pages pages = firstPane.Pages; foreach (Page page in pages) { totalLines += page.Lines.Count; } // 用完记得释放所有COM对象,避免后台残留WINWORD进程
注意事项
- 你原有字数统计代码存在COM对象泄漏问题,未手动释放RCW对象的情况下,WINWORD进程会持续在后台运行占用资源,建议按照示例代码补充释放逻辑,异常分支也要做资源回收。
- 两种方法的统计结果和Word客户端自带字数统计面板的数值完全一致,第一种方法因为不需要遍历分页对象,打开大文档时性能优势非常明显,优先选用。
- 不推荐在ASP.NET、Windows服务等非交互式服务端场景使用Interop组件,这类场景如果需要统计行数,可使用OpenXML SDK自行计算排版结果,但无法保证和客户端排版的行数100%一致。
内容的提问来源于stack exchange,提问作者Tiny Developer
相关产品推荐
相关产品推荐

