【问题标题】:How to manipulate MS Word 2010 document word by word如何逐字操作 MS Word 2010 文档
【发布时间】:2016-01-26 00:53:53
【问题描述】:

我想开发一个 MS Word 2010 插件(2013/2016 也是),它的工作原理类似于土耳其语文本的拼写检查器(恢复重音字符)。我想为用户提供 3 个选项(通过上下文菜单)以使用该工具。

  • 修复文档中的所有文本。 (包括表格和列表等)
  • 修复选定区域中的所有文本
  • 固定光标位置的单词。

对于第一个选项,我尝试迭代所有单词并通过以下代码逐个修复它们:

var words = App.ActiveDocument.Words;

foreach (Range word in words)
{
    var corr = MyCorrecter(word.Text);
    word.Select();
    App.Selection.TypeText(corr);
}

但是,这陷入了无限循环。 word.Next() 总是返回第一个单词。如果我删除word.Text = MyCorrecter(word.Text); 行,代码将成功迭代所有单词。周围有查找/替换示例,但对于这种特殊情况,这些示例效率不高。

简而言之,在 Word 文档中逐个操作单词最有效的方法是什么?

【问题讨论】:

  • @stuartd 上面的代码,除了word.Text = MyCorrecter(word.Text); 行之外,还循环遍历每个单词。但是当我设置一个单词的文字时,它不起作用。
  • 什么样的“不起作用” - 文本没有改变,有错误,或者..?
  • @stuartd 我编辑了这个问题。请重新阅读代码下方的段落。

标签: c# ms-word office-interop


【解决方案1】:

对于这种情况 - 您实际上是在更改目标范围(“单词”)的内容,您需要使用一个使用索引“计数”的循环。例如:

Word.Words words = app.ActiveDocument.Words;
int iWordCount = words.Count;
Word.Range rngWord = null;
for (int i = 1; i<= iWordCount; i++) 
{
  rngWord = words[i]
  var corr = MyCorrecter(rngWord.Text);
  rngWord.Text = corr;
 }
//When you're done, dont' forget to release the COM objects
rngWord = null;
words = null;

我强烈建议您不要在代码中使用 Select 或 Selection,除非您需要做的事情不能以任何其他方式完成。直接分配给 Range.Text 对象。

请注意,Word 中的某些情况有助于在文档中向后运行循环(从最高计数器到最低计数器)。不过,我认为这种情况会继续下去。

【讨论】:

  • "我强烈建议您不要在代码中使用 Select 或 Selection,除非您需要做的事情不能以任何其他方式完成。直接分配给 Range.Text 对象。"可以详细说明一下吗?
  • 选择的执行速度往往较慢。它不那么可靠-用户可以单击文档/它可能不是您认为的位置。稍后或对于其他人来说,不清楚代码在做什么以及在哪里。在 Word.Application 中只能有一个选择,但可以有多个范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多