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

标签 c# ms-word openxml openxml-sdk

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

我需要将图像插入特定位置 - 该位置由 Content Controll 元素定义,该元素可以位于文档的主要部分、页眉或页脚中。

我正在像这样控制内容:

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

    return result;
}

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

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

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

有没有办法从 SdtRun 导航到 documentPart?我检查了 .Parent 但找不到从 OpenXmlElementOpenXmlPart 的方法 - 它们位于不同的层次结构中。

最佳答案

我推荐以下方法。它使用 Ancestor避免 recursion并利用短路Null-conditional Operators来自 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;
    }

关于c# - 在 OpenXML 中处理 Word 文档时从 OpenXmlElement 获取 DocumentPart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45734853/

相关文章:

javascript - 使用 Office JS 遍历 Word 文档

c# - 使用open xml和C#将图像插入到word文档中

c# - 使用 OpenXML SDK 在 Excel 电子表格中创建单元格注释

asp.net - 无法在 OpenXMl Cell 样式中使用多种字体

vba - 如何在 Word-VBA 中跳转到书签并插入文本?

c# - 如何从控制台应用程序中以 Dictionary<string,string> 的形式获取命名参数?

c# - 一种为 http 响应编写重试的优雅方法

c# - 发送照片电报 API

c# - 在聚合框架 C# 中使用 Facets

c# - 如何从字节数组加载Word文档