以编程方式搜索 Word 文档中的格式化文本并用标签括起来

本文关键字:文本 标签 起来 格式化 方式 编程 搜索 Word 文档 | 更新日期: 2023-09-27 18:37:18

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

我已经阅读了他们在这里要说的话:http://msdn.microsoft.com/en-us/library/f1f367bx.aspx(例如"使用 Find 对象循环浏览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 是如何让正则表达式选择完整的斜体字符串,而不仅仅是单个单词。在 * 之后使用 @ 表示"一个或多个"一次返回一个字符,似乎不可能使其更贪婪。但是第二个问题很容易解决(在互操作后模式下),如果我只是将这些标签放入文本中。

另一个编辑:

应用。Selection.InsertBefore("X");如果我坚持使用字母和数字,确实有效。一旦我尝试插入 Word 样式正则表达式中使用的<或其他特殊字符,它就会变得非常慢。所以也许我会使用一些有保证的唯一组合,稍后替换它们,例如"ssttaarrtt"和"eenndd"。憨。:)>

以编程方式搜索 Word 文档中的格式化文本并用标签括起来

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

对于文档中的每个字符

创建字符范围(文档范围(字符,字符+1))

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

如果是斜体,则在此字符之前插入"",并设置一个标志 (EM_FLAG),表明您位于 标记中。

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

丑陋,但我认为它应该有效。