You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:18:24