我正在使用 .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 属性中看到这些值,因此我可以从那里提取它们,但这并不理想。
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;
}