ComputeStatistics 返回错误的行数值。如何在 MS Word 中获得实际的行数?

Posted

技术标签:

【中文标题】ComputeStatistics 返回错误的行数值。如何在 MS Word 中获得实际的行数?【英文标题】:How to get Line Count in MS Word? 【发布时间】:2022-01-22 06:18:05 【问题描述】:

我正在使用 Word Interop 来计算表 Cell 中存在的行数。 有问题的单元格如下所示(为清楚起见,启用了特殊字符)。

文本中出现的换行字符数为 3。但是,由于第二个文本的长度,它被扩展到第二行,导致实际为 4 行。

下面的代码只计算换行符的个数并不能正常工作,因为它返回 3。

input.Count(x => x == '\r'); //Result:3

Word 提供的字数统计工具提供了正确的结果,4 行。

以下代码使用 Cell.Range 属性来访问字数统计工具使用的 ComputeStatistics 函数。但是函数调用的结果总是0。

lines = cell.Range.ComputeStatistics(WdStatistic.wdStatisticLines); //Result:0

我已经尝试迭代范围内的所有段落,在计算运行总数时分别为每个 Paragraph.Range 调用 ComputeStatistics 函数。第一段返回值 1,但所有后续调用都返回值 0。

如何获取字数统计工具显示的行数值? 如果有的话,有什么替代方法可以可靠地在 Word 中获得准确的行数?

【问题讨论】:

【参考方案1】:

关于单元格结束标记的某些内容似乎干扰了统计信息。这在 VBA 中对我有用:

Dim c As Cell, rng As Range

Set c = ThisDocument.Tables(1).Cell(1, 1)
Set rng = c.Range
rng.MoveEnd wdCharacter, -1

Debug.Print rng.ComputeStatistics(wdStatisticLines)  '4

【讨论】:

我会试一试并报告。 有效!对于这些类型的专家答案,一定会喜欢 ***。非常感谢威廉姆斯先生!现在,由于这个相当简单的实现,我的解决方案将保持干净。 我创建了一个拉取请求来更改官方文档以反映这一点。 github.com/MicrosoftDocs/VBA-Docs/pull/1471【参考方案2】:

这里是C#的实现代码

private int GetNumberOfLinesInRange(Cell cell)

     int lines = -1;
     Range cellRange = cell.Range;

     //Range decreased by 1 
     //to omit the end of cell marker from the calculation which 
     //interferes with the ComputeStatistics result
     cellRange.MoveEnd(WdUnits.wdCharacter, -1); 

     lines = cellRange.ComputeStatistics(WdStatistic.wdStatisticLines);
     return lines;

【讨论】:

以上是关于ComputeStatistics 返回错误的行数值。如何在 MS Word 中获得实际的行数?的主要内容,如果未能解决你的问题,请参考以下文章

组上的 MySQL COUNT() 返回错误的行数

PL/SQL ORA-01422:精确提取返回的行数超过了请求的行数

休眠 - 批量更新从更新返回意外的行数:0 实际行数:0 预期:1

“精确提取返回的行数超过了请求的行数”

NSFetchedResultsController 在向第二部分插入行时在第一部分返回错误的行数

“确切的提取返回超过请求的行数”