【问题标题】:Programmatically search formatted text in Word document and surround with tags以编程方式搜索 Word 文档中的格式化文本并用标签包围
【发布时间】:2015-03-10 14:22:40
【问题描述】:

我正在使用 Word 与 C# 互操作将一组 Word 文档转换为 HTML。这些转换需要一些手动干预,这就是为什么我要创建这个“中间站”来进行必要的调整。我发现的所有全自动转换工具都创建了很多内联样式和其他我不想要的东西。不过,我想自动处理的一件事是找到所有斜体文本部分并用 标签包围它们(或者更确切地说用标签包围的相同文本替换它们)。

我已经阅读了他们在此处所说的内容:http://msdn.microsoft.com/en-us/library/f1f367bx.aspx(例如“使用查找对象循环浏览 Microsoft Office Word 文档并搜索特定文本、格式或样式”)并且我知道如何查找一个文本并将其替换为另一个文本,但我无法弄清楚如何找到开始的格式,更不用说如何在其周围插入其他文本了。任何指针将不胜感激。

编辑:我尝试了一个正则表达式 (https://support.office.com/en-ca/article/Find-and-replace-text-by-using-regular-expressions-Advanced-eeaa03b0-e9f3-4921-b1e8-85b0ad1c427f),但占位符似乎在互操作中不起作用。否则这样的事情可能会起作用(如果占位符没有被解释为未知的转义序列):

findObject.Text = "(*)";
findObject.Font.Italic = 1;
findObject.Replacement.Text = "<em>\1</em>";

编辑 2: 我可能在正确的轨道上,但还有两个问题。这段代码一个接一个地显示每个斜体字:

Range rng = doc.Range();
rng.Find.ClearFormatting();
object missing = Type.Missing;
rng.Find.Font.Italic = 1;

while(rng.Find.Execute("<*>",
    ref missing, ref missing, true, ref missing, ref missing, ref missing,
    ref missing, true, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing)) {
        rng.Select();
        string txt = application.Selection.Text;
        application.Selection.Text.Replace(txt, "<em>" + txt + "</em>");
        application.Selection.InsertBefore("<em>");
        MessageBox.Show(application.Selection.Text);
}

然后我假设我可以做这样的事情:

application.Selection.InsertBefore("<em>");
application.Selection.InsertAfter("</em>");

或者这个:

string txt = application.Selection.Text;
application.Selection.Text.Replace(txt, "<em>" + txt + "</em>");

但在第一种情况下,Visual Studio 基本上会冻结(或永远停止),在第二种情况下,什么都不会被替换。

所以问题 1 是如何在这种情况下替换选择。 问题 2 是如何使正则表达式选择完整的斜体字符串,而不仅仅是单个单词。在 * 之后使用 @ 表示“一个或多个”一次返回一个字符,似乎不可能使它更贪婪。但是如果我只是将这些标签放入文本中,那么第二个问题之后很容易解决(在后互操作模式下)。

又一次修改:

application.Selection.InsertBefore("X");如果我坚持字母和数字,确实有效。一旦我尝试插入

【问题讨论】:

  • 您是否尝试过将 range.find 与正则表达式一起使用并使用 insertBefore 和 insertAfter 方法?
  • 在我发布最后一次编辑之前,我没有看到您的问题。如果我理解正确,我想答案是肯定的。 :)

标签: c# search replace ms-word office-interop


【解决方案1】:

只是一个快速而肮脏的解决方案。

文档中的每个字符

创建一个range的字符(document.range(character,character+1))

使用Range.italic 检查范围是否为斜体。

如果是斜体,在这个字符前插入一个“”并设置一个标志(EM_FLAG),表明你在一个标签中。

如果不是斜体并且设置了标志 EM_FLAG,则在“”之后插入

丑陋,但我认为它应该可以工作。

【讨论】:

  • 是的,它正在工作,但不幸的是它太慢了。
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多