0

MS Wordドキュメントで定義されたMergeFieldsを外部データソースからのデータで埋めるC#アプリケーションを作成しています。

私はOpenXmlSDKを使用していますが、単一のフィールドを置き換えるとすべてが正常に機能します。

私がやりたいのは、いくつかのMergeFieldsが定義されたセクションを作成し、入力データに従ってそのようなセクションを数回コピーできるようにすることです。

たとえば、ドキュメントに複数のMergeFieldsを持つ製品情報を含む段落を含めることができますが、データに複数の製品の情報がある場合、入力データにある製品と同じ数の段落を出力ドキュメントに生成したいと思います。

商品:[[商品名]]、金額:[[商品金額]]、価格:[[商品価格]]

段落を折り返すためのWord文書の「論理セクション」のようなものはありますか?そうでない場合、これを行うためのあなたのアドバイスは何ですか?

4

1 に答える 1

1

行ごとに個別にマージを実行してから、結果を 1 つのドキュメントに連結することができます。多くのドキュメントを結合するサンプル メソッドを次に示します。この例では、Break 要素を使用して分離していますが、これは必須ではありません..

        private MemoryStream JoinDocuments(List<MemoryStream> subDocuments)
    {
            var sumLength = (from MemoryStream ms in subDocuments select ms.Length).Sum();
            MemoryStream mainDocumentStream = new MemoryStream((int)sumLength);

          // Create a Wordprocessing document.
          using (WordprocessingDocument myDoc = WordprocessingDocument.Create(mainDocumentStream, WordprocessingDocumentType.Document))
          {
            // Add a new main document part.
            MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
            //Create Document tree for simple document.
            mainPart.Document = new Document();
            //Create Body (this element contains other elements that we want to include
            Body body = new Body();

            for (int i = 0; i < subDocuments.Count; i++)
            {
                var subDocument = subDocuments[i];
                subDocument.Position = 0;
                string altChunkId = "AltChunkId" + i;
                AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
                chunk.FeedData(subDocument);

                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;
                body.Append(altChunk);
                Break pageBreak = new Break();
                pageBreak.Type = BreakValues.Page;
                body.Append(pageBreak);

            }

            mainPart.Document.Append(body);
            // Save changes to the main document part.
            mainPart.Document.Save();
          }
          return mainDocumentStream;
    }
于 2010-01-21T10:59:29.210 に答える