1

複数のドキュメントを 1 つのドキュメントにマージしてから、結果のドキュメントを開いてさらに処理しようとしています。

「ChunkId」は、一意の ID を取得するためにこのメソッドが呼び出されるたびに増加するプロパティです。このサイトの例に従いました。これは、(altchunks を使用して) 複数のドキュメントをマージするために使用されるコードです: `

private void MergeDocument(string mergePath, bool appendPageBreak)
    {
        if (!File.Exists(mergePath))
        {
            Log.Warn(string.Format("Document: \"{0}\" was not found.", mergePath));
            return;
        }

        ChunkId++;
        var altChunkId = "AltChunkId" + ChunkId;

        var mainDocPart = DestinationDocument.MainDocumentPart;
        if (mainDocPart == null)
        {
            DestinationDocument.AddMainDocumentPart();
            mainDocPart = DestinationDocument.MainDocumentPart;
            if (mainDocPart.Document == null)
                mainDocPart.Document = new Document { Body = new Body() };
        }

        try
        {
            var chunk = mainDocPart.AddAlternativeFormatImportPart(
                AlternativeFormatImportPartType.WordprocessingML, altChunkId);
            if (chunk != null)
                using (var ms = new FileStream(mergePath, FileMode.Open))
                {
                    chunk.FeedData(ms);
                }
            else
            {
                Log.Error(string.Format("Merge - Failed to create chunk document based on \"{0}\".", mergePath));
                return; // failed to create chunk document, return from merge method

            }
        }
        catch (Exception e)
        {
            Log.Error(string.Format("Merge - Failed to insert chunk document based on \"{0}\".", mergePath));
            return; // failed to create chunk document, return from merge method

        }

        var altChunk = new AltChunk { Id = altChunkId };

        //append the page break
        if (appendPageBreak)
            try
            {
                AppendPageBreak(mainDocPart);
                Log.Info(string.Format("Successfully appended page break."));
            }
            catch (Exception ex)
            {
                Log.Error(string.Format("Eror appending page break. Message: \"{0}\".", ex.Message));
                return; // return if page break insertion failed
            }

        // insert the document 
        var last = mainDocPart.Document
        .Body
        .Elements()
        .LastOrDefault(e => e is Paragraph || e is AltChunk);
        try
        {
            if (last == null)
                mainDocPart.Document.Body.InsertAt(altChunk, 0);
            else
                last.InsertAfterSelf(altChunk);
            Log.Info(string.Format("Successfully inserted new doc \"{0}\" into destination.", mergePath));
        }
        catch (Exception ex)
        {
            Log.Error(string.Format("Error merging document \"{0}\". Message: \"{1}\".", mergePath, ex.Message));
            return; // return if the merge was not successfull
        }

        try
        {
            mainDocPart.Document.Save();
        }
        catch (Exception ex)
        {
            Log.Error(string.Format("Error saving document \"{0}\". Message: \"{1}\".", mergePath, ex.Message));
        }
    }`

マージされたドキュメントを Word で開くと、その内容 (表、テキスト、段落など) が表示されますが、コードからもう一度開くと、内部テキストは "" (空の文字列) であると表示されます。「@@name@@」などのプレースホルダーを別のテキストに置き換える必要があり、内部テキストが空の場合はできないため、ドキュメントの内容を反映する内部テキストが必要です。

これはマージされたドキュメントの innerxml です。

ここに画像の説明を入力

これは、マージされたドキュメントを開く方法です。

DestinationDocument = WordprocessingDocument.Open(Path.GetFullPath(destinationPath), true);

ドキュメントの内部テキストを読むにはどうすればよいですか? または、この問題が発生しないように、これらのドキュメントを 1 つにマージするにはどうすればよいですか?

4

2 に答える 2

2

ドキュメントが s とマージさAltChunkれると、元の Word ドキュメントに添付ファイルが埋め込まれたようなものになります。クライアント (MS Word) は、altchunkセクションのレンダリングを処理します。openxmlしたがって、結果のドキュメントには、マージされたドキュメントのマークアップが含まれません。

結果のドキュメントをさらにプログラムによる後処理に使用する場合は、Openxml Power Tools. ここで私の答えを参照してください

Openxml パワーツール - https://github.com/OfficeDev/Open-Xml-PowerTools

于 2016-05-18T15:38:09.703 に答える