2

AltChunkオブジェクトを使用して、docxファイルから別のファイルのリッチテキストコンテンツコントロールにデータをコピーしました。コピーは正常に機能します。ただし、現在、コンテンツコントロールをSdtElementOpenXmlのにキャストすることもContentControlVSTOのにキャストすることもできません。

これは私が使用したコードです

SdtElement sdtElement = destinationdocument.MainDocumentPart.Document.Body.Descendants<SdtElement>().Where(b => b.SdtProperties.GetFirstChild<Tag>() != null).FirstOrDefault();
string altChunkId = "AltChunkId" + Guid.NewGuid().ToString();
AlternativeFormatImportPart chunk = destinationdocument.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImport    PartType.WordprocessingML, altChunkId);
chunk.FeedData(File.Open("sourceFile", FileMode.OpenOrCreate));
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
sdtElement.RemoveAllChildren();
sdtElement.Append(altChunk);

初めてコードが正常に機能するとき。ただし、2回目の実行では、最初の行で例外をキャストできませんがスローされます。クライアント側でVSTOを使用しているときにも同じ問題が発生し、ContentControlオブジェクトはAltChunkが挿入されたコンテンツコントロールを保持できません。どういうわけか、この手順はリッチテキストコンテンツコントロールを破壊します。

私が間違っていることはありますか?または、より良い代替手段はありますか?

4

1 に答える 1

2

wordDocument.MainDocumentPart.Document.Body.Descendants<SdtElement>()が返さIEnumerable<SdtElement>れ、それを に割り当てていSdtElemtntます。varまたは実際の戻り値の型を使用してみてください。

アップデート:

あなたのコードは機能しています。あなたが間違っているのはこの行ですsdtElement.RemoveAllChildren();

sdt 要素 (コンテンツ コントロール) には、以下の例のように、sdtPr (コンテンツ コントロール プロパティ)、sdtContent (コンテンツ コントロール内の実際のコンテンツ) などの他の要素が含まれます。

 <w:sdt>
    <w:sdtPr>
        ...
    </w:sdtPr>
    <w:sdtContent>
      ....
    </w:sdtContent>
  </w:sdt>

あなたsdtElement.RemoveAllChildren();がしていることは、 sdt 要素内のすべてを削除し、それらを次のように置き換えることです:

<w:sdt>
   <w:altChunk r:id="AltChunkIdffebf242-30b3-4905-bf39-fc0077be9474" />
</w:sdt>

destinationdocument.MainDocumentPart.Document.Body.Descendants<SdtElement>().Where(b => b.SdtProperties.GetFirstChild<Tag>() != null).FirstOrDefault();これは、置換されたドキュメントの sdt 要素に noSdtPropertiesと noTagまたはがないため、 secondrun で例外をスローするようにプログラムを作成していますsdtContent

この問題を回避するsdtContentには、以下のように sdt 要素ではなく、altchunk ブロックをコンテンツ コントロールのコンテンツ要素 ( ) に直接挿入してみてください。

using (
    FileStream fileStream = File.Open("file.docx",
                                        FileMode.Open))
{
    chunk.FeedData(fileStream);
    AltChunk altChunk = new AltChunk();
    altChunk.Id = altChunkId;
    //sdtElement.RemoveAllChildren();
    sdtElement.Elements<SdtContentBlock>().FirstOrDefault().Append(altChunk); // This is going to add to the existing content.
}

お役に立てれば!

于 2013-02-12T11:38:18.900 に答える