在 OpenXML 中处理 Word 文档时从 OpenXmlElement 获取 DocumentPart

tra*_*max 3 c# ms-word openxml openxml-sdk

我正在使用 OpenXML API 修改 docx 模板并遇到问题。

我需要将图像插入到某个位置 - 该位置由内容控制元素定义,该元素可以位于文档的主要部分、页眉或页脚中。

我得到这样的内容控制:

static IEnumerable<TElement> GetDecendants<TElement>(OpenXmlPart part) where TElement : OpenXmlElement
{
    var result = part.RootElement
        .Descendants()
        .OfType<TElement>();

    return result;
}
Run Code Online (Sandbox Code Playgroud)

稍后,我需要通过此管道将图像插入到文档的正确部分

internal static OpenXmlElement InsertImage(OpenXmlPart documentPart, Stream stream, string fileName, int imageWidth, int imageHeight)
{
    // actual implementation that is tested and works
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,当我发现需要用图像替换的 ContentControl 元素时,我没有引用documentPart- 我只有引用 soSdtRunSdtBlock

有没有办法导航到documentPartfrom SdtRun?我已经检查过.Parent,但找不到从 到 的方法OpenXmlElement-OpenXmlPart这些位于不同的层次结构中。

Tat*_*ead 5

我推荐下面的方法。它使用Ancestor来避免递归,并利用C# 6 中的短路空条件运算符

    internal static OpenXmlPart GetMainDocumentPart(OpenXmlElement xmlElement)
    {
        return
        xmlElement?.Ancestors<Document>()?.FirstOrDefault()?.MainDocumentPart as OpenXmlPart ??
        xmlElement?.Ancestors<Footer>()?.FirstOrDefault()?.FooterPart as OpenXmlPart ??
        xmlElement?.Ancestors<Header>()?.FirstOrDefault()?.HeaderPart as OpenXmlPart;
    }
Run Code Online (Sandbox Code Playgroud)