Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式搜索Word文档中的格式化文本并用标记环绕_C#_Search_Replace_Ms Word_Office Interop - Fatal编程技术网

C# 以编程方式搜索Word文档中的格式化文本并用标记环绕

C# 以编程方式搜索Word文档中的格式化文本并用标记环绕,c#,search,replace,ms-word,office-interop,C#,Search,Replace,Ms Word,Office Interop,我正在使用Word interop和C#将一组Word文档转换为HTML。这些转换需要一些手动干预,这就是为什么我要创建这个“中间站”,在这里可以进行必要的调整。我发现的所有全自动转换工具都会创建很多内联样式和其他我不想要的东西。不过,我想自动处理的一件事是,用斜体找到所有文本部分,并用标记包围它们(或者用标记包围的相同文本替换它们) 我已经阅读了他们在这里所说的内容:(例如,“使用Find对象循环浏览Microsoft Office Word文档并搜索特定的文本、格式或样式”),我知道如何查找

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

我已经阅读了他们在这里所说的内容:(例如,“使用Find对象循环浏览Microsoft Office Word文档并搜索特定的文本、格式或样式”),我知道如何查找一个文本并替换为另一个文本,但我还没能弄清楚如何首先查找格式,更不用说如何在其周围插入其他文本了。任何指点都将不胜感激

编辑:我尝试了一个regex(),但在互操作中占位符似乎不起作用。否则类似的方法可能会起作用(如果占位符没有被解释为未知的转义序列):

findObject.Text=“(*)”;
findObject.Font.Italic=1;
findObject.Replacement.Text=“\1”;
编辑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);
}
Range rng=doc.Range();
rng.Find.ClearFormatting();
对象缺失=类型。缺失;
rng.Find.Font.Italic=1;
while(rng.Find.Execute)(“,
缺少参考,缺少参考,为真,缺少参考,缺少参考,缺少参考,
参考缺失,真,参考缺失,参考缺失,参考缺失,参考缺失,参考缺失,
参考缺失,参考缺失){
rng.Select();
字符串txt=application.Selection.Text;
application.Selection.Text.Replace(txt,“+txt+”);
application.Selection.InsertBefore(“”);
MessageBox.Show(application.Selection.Text);
}
然后我假设我可以做这样的事情:

application.Selection.InsertBefore("<em>");
application.Selection.InsertAfter("</em>");
application.Selection.InsertBefore(“”);
application.Selection.InsertAfter(“”);
或者这个:

string txt = application.Selection.Text;
application.Selection.Text.Replace(txt, "<em>" + txt + "</em>");
string txt=application.Selection.Text;
application.Selection.Text.Replace(txt,“+txt+”);
但在第一种情况下,VisualStudio基本上冻结(或永远冻结),在第二种情况下,没有任何东西被替换

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

还有一个编辑:


application.Selection.InsertBefore(“X”);如果我坚持使用字母和数字,它确实有效。只要我尝试插入<或Word样式正则表达式中使用的其他特殊字符,它就会变得非常缓慢。所以也许我会使用一些有保证的独特组合,并在以后替换它们,比如“ssttaarrtt”和“eenndd”。愚蠢的。:)

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

对于文档中的每个字符

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

用于检查范围是否为斜体

如果是斜体,则在此字符前插入“”并设置一个标志(em_标志),表明您在标记中

如果不是斜体且标志EM_标志已设置,则在“
后插入


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

是的,它能工作,但不幸的是它太慢了。您是否尝试过使用range.find和regexp以及使用insertBefore和insertAfter方法?直到发布上次编辑,我才看到您的问题。如果我理解正确,我想答案是肯定的
string txt = application.Selection.Text;
application.Selection.Text.Replace(txt, "<em>" + txt + "</em>");