如何使用VBA或.net 2005突出显示特定字体的句子

本文关键字:显示 字体 句子 VBA 何使用 net 2005 | 更新日期: 2023-09-27 18:27:12

我在MSWord 2007和VBA以及Visual Studio 2005中工作。在我的MSWord文档中包含不同的字体,我想突出显示特定字体的文本。就像用Arial写的一句话,那么我想单独强调这句话。

如何使用VBA或.net 2005突出显示特定字体的句子

首先,您希望找到具有给定字体的所有文本部分。在MSWord 2007中使用的docx格式中,具有公共属性的文本部分称为run,由<w:r>标记指定(ECMA-376第33页)。运行丰富的格式(包括其字体)存储在<w:rPr>标记中,特别是<w:rFonts>标记中。因此,为了找到具有给定字体的文本部分,我们要查找具有适当字体信息的<w:rFonts>标记。

<w:rFonts>标签的格式如下(去掉了一些不相关的属性):

 <w:rFonts w:ascii=”FontName” 
           w:cs=”FontName” 
           w:eastAsia=”FontName” 
           w:hAnsi=”FontName”/>

属性对应于不同的编码:

  • w:ascii对应ASCII
  • w:cs对应于需要复杂格式技术的Unicode字符
  • w:eastAsia对应于东亚Unicode范围内的字符
  • w:hAnsi对应于Unicode范围中不属于上述类别之一的任何字符

假设文档中没有任何中文、阿拉伯语或其他形式的复杂文本,则可以安全地忽略w:csw:eastAsia属性。

概括一下,我们需要找到所有具有与所需字体或换句话说<w:rFonts w:ascii="Needed Font" w:hAnsi="Needed Font">对应的w:asciiw:hAnsi属性的<w:rFonts>

现在,如果您不熟悉docx格式,它实际上是由几个文件组成的包,其中包括XML文件(有关docx文档结构的更多信息)。我们可以使用System.IO.Packaging和XML解析类来处理docx文档,但我们从Microsoft获得了一个有用的抽象-Open XML SDK,它为我们处理docx文件提供了一个很好的类层次结构:

  • 文字处理文档
  • 文件
  • 车身
  • 段落
  • Run
  • RunProperties
  • RunFonts

一旦我们进入RunFonts类,我们就有两个与我们相关的属性——RunFonts.AsciiRunFonts.HighAnsi。我们如何到达那里?以下代码片段演示:

using System;
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
namespace WordProcessingEx
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string fileName = /*obtain path to file here*/;
            using (WordprocessingDocument myDocument = WordprocessingDocument.Open(fileName, true))
            {
                // Get all paragraphs
                var p = myDocument.MainDocumentPart.Document.Body.Elements<Paragraph>().First();
                var r = from para in p
                        from run in para.Elements<Run>()
                        where run.RunProperties.RunFonts.ASCII ="NeededFont" || run.RunProperties.RunFonts.HighAnsi = "NeededFont"
                        select run;
            }
        }
    }
}

现在我们已经用适当的字体进行了所有的运行,我们需要突出显示它们。这是通过<w:highlight>标签及其w:val属性来实现的。例如-<w:highlight w:val="yellow"/>

以下代码片段演示:

foreach (var run in r)
{
    run.RunProperties.Highlight.SetAttribute(new OpenXmlAttribute("w:val", null, "yellow"));
}

(这出现在上面的using块中,就在LINQ查询之后)

在这一切之后,我们结束了。一旦执行离开using块,使用所选字体的每次运行都会高亮显示。