繁体   English   中英

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

[英]How to determine whether a MS-Word paragraph is more than one line?

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

如果它在一行中,就像这样在中心

在此处输入图片说明

或左对齐如果在多行

在此处输入图片说明

VSTO中如何判断一个段落是否不止一行?

由于“线”不是 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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM