2017-08-17 44 views
1

OpenXML APIを使用してdocxテンプレートを変更していて、問題が発生しました。OpenXMLでWord文書を操作するときにOpenXmlElementからDocumentPartを取得

イメージを特定の場所に挿入する必要があります。その場所は、ドキュメントのメイン部分、フッターのヘッダーに含めることができるコンテンツコントロール要素で定義されています。このような

私は取得していたコンテンツcontroll:その後、私は今、私の問題がある。この

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

を経由して文書の正しい部分に画像を挿入する必要がパイプラインダウン

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

    return result; 
} 

イメージで置き換える必要のあるContentControl要素が見つかった場合、documentPartへの参照がありません。参照番号がSdtRunまたはSdtBlockの場合のみ参照できます。

documentPartに移動する方法はありますか?SdtRun.Parentを確認しましたが、OpenXmlElementからOpenXmlPartに移動する方法が見つかりませんでした。これらは異なる階層にあります。

答えて

2

。それはrecursionを避けるために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; 
    } 
+0

うわーから短絡Null-conditional Operatorsを利用しています!それはたくさんの疑問符です!私は仕事に戻るときにそれをチェックします。ありがとう! – trailmax

+1

これは一般的に動作します。しかし、 'xmlElement'が' Header'や 'Document'や' Footer'のときには失敗します。同じ種類の祖先はありません。しかし、一般的な考え方と私を 'Ancestors <>()'(私が前に知らなかった方法)に向けるのは良いです – trailmax

+0

実際に 'Header'、' Footer'と 'Document'は' OpenXmlPart'であり、 'OpenXmlElement'です。このメソッドを呼び出すと、コンパイルされずに実行されることもありません。私はこの方法があなたを待つべきだと思う。 – Taterhead

1

OpenXMLのソースコードを見て、私が必要とした方法を見つけました。 internalとマークされているだけで、自分のコードで使用できませんでした。

だから私はこの思い付いた:私は、以下の方法をお勧めします

using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Wordprocessing; 
using System; 


internal static class XmlElementHelpers 
{ 
    internal static OpenXmlPart GetDocumentPart(this OpenXmlElement xmlElement) 
    { 
     if (xmlElement == null) 
     { 
      return null; 
     } 
     if (xmlElement is Document document) 
     { 
      return document.MainDocumentPart; 
     } 

     if (xmlElement is Header header) 
     { 
      return header.HeaderPart; 
     } 

     if (xmlElement is Footer footer) 
     { 
      return footer.FooterPart; 
     } 

     return GetDocumentPart(xmlElement.Parent); 
    } 
} 
関連する問題