1

Word 2010 GUI を使用すると、「ファイルからテキストを挿入...」というオプションがあり、まさにそれを行います。ドキュメントの主要部分のテキストをドキュメントの現在の場所に挿入します。

C# と OpenXml SDK 2.0 を使用して同じことをしたいと思います

using (var mainDocument = WordprocessingDocument.Open("MainFile.docx", true);
{
    var mainPart = mainDocument.MainDocumentPart;
    var bookmarkStart = mainPart
                        .Document
                        .Body
                        .Descendants<BookmarkStart>()
                        .SingleOrDefault(b => b.Name == "ExtraContentBookmark");
    var extraContent = GetTextFromFile("ExtraFile.docx");

    bookmarkStart.InsertAfterSelf(extraContent);
}

プレーン Xml (XElement)、OpenXmlElement (MainDocumentPart.Document.Body.Descendants)、および AltChunk を使用してみました。これまでのすべての代替案では、非準拠の docx ファイルが生成されました。

メソッドはGetTextFromFileどのように見えるべきですか?

4

2 に答える 2

2

これが私がそれを実装した方法です。解決策は、Eric White で説明されているように AltChunk を使用することでした。私はすでにそれを試していましたが、ブラッドリーが彼の答えで言ったように、ブックマークはドキュメントのどこにでもある可能性があり、私の場合は段落内にありました。含まれている段落の前にテキストを挿入するとすぐに、すべてが正常に機能しました。

(簡略化された)コードは次のとおりです。

using (var mainDocument = WordprocessingDocument.Open("MainFile.docx", true);
{
    var mainPart = mainDocument.MainDocumentPart;
    var bookmarkStart = mainPart
                        .Document
                        .Body
                        .Descendants<BookmarkStart>()
                        .SingleOrDefault(b => b.Name == "ExtraContentBookmark");
    var altChunk = GetAltChunkFromFile("ExtraFile.docx", mainPart);

    var containingParagraph = element.Ancestors<Paragraph>().FirstOrDefault();
    containingParagraph.InsertBeforeSelf(altChunk);
}

...

private AltChunk GetAltChunk(string filename, MainDocumentPart mainDocumentPart)
{
    var altChunkId = "AltChunkId1";
    var chunk = mainDocumentPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.WordprocessingML, altChunkId);
    chunk.FeedData(File.Open(filename, FileMode.Open));
    var altChunk = new AltChunk { Id = altChunkId };
    return altChunk;
}
于 2012-05-21T09:41:19.600 に答える
1

ブックマークの場所に文書本体タグの子孫を挿入するほど単純ではありません。いくつかの理由:

  • 2 つのドキュメントは異なるスタイルを使用している可能性があります。依存するスタイル間でコピーするか、宛先ドキュメントでスタイルを使用するように参照を更新する必要があります。
  • この<bookmarkStart>タグは、段落、ラン、表のセルなど、ドキュメントのほぼどこにでも表示できます。段落やランをネストすることはできないため、ブックマークがどこにあるかを判断し、XML ツリーを昇順/降順する必要があります。コンテンツを挿入する適切な場所が見つかるまで。

OpenXml SDK を使用すると、実行しようとしている作業が非常に複雑になります。形式とそのスキーマを深く理解する必要があります。

Word に組み込まれている機能を使用できるため、代わりに VSTO/OLE オートメーションを使用することをお勧めします。

于 2012-05-21T01:03:59.663 に答える