如何确定MS-Word段落是否超过一行?

问题描述 投票:-1回答:1

我想要的是不查找段落(段落的结尾)中按下Enter的位置。我需要确定一个段落是包含一行还是多行,以便可以对其进行相应的格式设置(居中或左对齐)。

如果在一行中,请像这样居中

enter image description here

或在多行中左对齐

enter image description here

如何确定段落在VSTO中是否超过一行?

c# ms-word vsto
1个回答
0
投票

由于“行”不是Word对象模型中的对象,由于其动态布局算法,因此需要通过仍内置在API中的旧WordBasic技术来解决。 (WordBasic基于选择而不是对象工作,这就是为什么在这些旧方法中都具有此功能的原因。)

在这种情况下,Word.WdInformation枚举提供了与“行”一起使用的参数,更具体地说是针对此问题wdFirstCharacterLineNumber

以下示例代码包含一个代码片段,该片段在文档的特定段落上调用IsParaOneLine

IsParaOneLIne 重复项段落Range通过了两次[:一次是起点,一次是终点。然后将这些范围分别折叠到其起点和终点,并确定行号。如果两者相同,则将true返回到调用代码,否则返回false

注意:

  1. rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1);将端点后移一个字符,因为在折叠到段落Range的末尾后,Range位于下一段的开头。这会将其移回原始段落。
  2. 该示例应用样式,而不是“直接格式化”。我强烈建议您使用

    [Styles

,而不是在整个文档中居中对齐和左对齐。如果没有具有所需格式的内置样式,请创建所需的自定义样式。如果您熟悉CSS,就会知道使用样式的优点。使用Word的另一个原因是:它大大减少了Word生成的临时文件,从而减少了内存不足的可能性。 Word.Range rng = doc.Paragraphs[2].Range; if (IsParaOneLine(rng)) { rng.set_Style(Word.WdBuiltinStyle.wdStyleHeading1); } else { Debug.Print("Not one line"); } public bool IsParaOneLine(Word.Range rng) { Word.Range rngStart = rng.Duplicate; rngStart.Collapse(Word.WdCollapseDirection.wdCollapseStart); Word.Range rngEnd = rng.Duplicate; rngEnd.Collapse(Word.WdCollapseDirection.wdCollapseEnd); rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1); int posLineStart = (int) rngStart.get_Information(Word.WdInformation.wdFirstCharacterLineNumber); int posLineEnd = (int) rngEnd.get_Information(Word.WdInformation.wdFirstCharacterLineNumber); bool isSameLine = false; if (posLineStart == posLineEnd) isSameLine = true; return isSameLine; }
© www.soinside.com 2019 - 2024. All rights reserved.