0

我正在创建一个 C# 应用程序,它使用来自外部数据源的数据填充 MS Word 文档上定义的 MergeFields。

我正在使用 OpenXml SDK,替换单个字段时一切正常。

我想要做的是,有一个定义了几个 MergeFields 的部分,并且能够根据输入数据多次复制这样的部分。

例如,我可以在文档中包含一个包含多个 MergeFields 的产品信息的段落,但在数据中我有多个产品的信息,我想在输出文档中生成与输入数据中的产品一样多的段落。

产品:[[产品名称]],金额:[[产品数量]],价格:[[产品价格]]

Word 文档中是否有类似“逻辑部分”的东西来包装段落?如果没有,您对此有何建议?

4

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 回答