如何使用.Net Xceed DocX查找现有Word文档的当前字体系列和字体大小

问题描述 投票:0回答:1

我正在使用 .Net Xceed DocX 库阅读 Word 文档,如下所示:

var result = new MemoryStream();

using (DocX document = DocX.Load(stream))
{
  var paragraphs = document.Paragraphs;
  foreach (var paragraph in paragraphs)
  {
    if (paragraph.Text.Contains("{{Instructions}}"))
    {
      var bulletedList = document.AddList(null, 0, ListItemType.Bulleted);
      document.AddListItem(bulletedList, "Bullet Point 1");
      document.AddListItem(bulletedList, "Bullet Point 2");
      document.AddListItem(bulletedList, "Bullet Point 3");

      paragraph.InsertListAfterSelf(bulletedList);
      paragraph.RemoveText(0);
      break;
    }
  }
  document.SaveAs(result);
}

我搜索一个名为 {{Instructions}} 的术语,我想将其替换为项目符号列表。这可行,但列表具有默认的字体系列和字体大小。 我想找到当前段落的字体或文档的字体,然后将具有这些字体值的 Formatting 对象传递给 AddListItem 方法。

我无法找到当前字体系列或字体大小作为段落或文档的属性。

我可以在段落的 Xml 属性中看到这些值,因此我可以从那里提取它们,但这并不理想。

c# .net docx xceed
1个回答
0
投票

Xceed DocX Formatting 对象有一个名为 Parse 的静态方法,它可以获取 XElement 并返回 Formatting 对象。 我需要使用递归来获取带有字体的格式化对象。

var formatting = GetFormatting(paragraph.Xml);  

Formatting GetFormatting(XElement rPr)
{
  var formatting = Formatting.Parse(rPr);
  if(formatting.FontFamily == null)
  {
    formatting = GetFormattingRecursive(rPr, formatting);
  }

  if (formatting.FontFamily == null)
  {
    formatting.FontFamily = new Font("Arial");
  }
  if (formatting.Size == null)
  {
    formatting.Size = 9d;
  }

 return formatting;
}

Formatting GetFormattingRecursive(XElement element, Formatting formatting)
{
  if(element.Elements()?.Any() == true)
  {
    foreach (var e in element.Elements())
    {
      formatting = Formatting.Parse(e);
      if (formatting.FontFamily != null)
      {
        return formatting;
      }
      else
      {
        formatting = GetFormattingRecursive(e, formatting);
      }
    }
  }

  return formatting;
}
© www.soinside.com 2019 - 2024. All rights reserved.