Как заменить раздел в шаблоне слова с несколькими полями C # - PullRequest
0 голосов
/ 07 октября 2009

Я создаю приложение C #, которое заполняет поля MergeFields, определенные в документе MS Word, данными из внешнего источника данных.

Я использую OpenXml SDK, и все отлично работает при замене отдельных полей.

Я хочу создать раздел с несколькими полями MergeFields и иметь возможность копировать этот раздел несколько раз в соответствии с входными данными.

например. Я могу иметь в документе абзац, содержащий информацию о продукте с несколькими полями MergeFields, но в данных, которые у меня есть информация о нескольких продуктах, я хочу создать столько же абзацев в выходном документе, сколько продуктов во входных данных.

Товар: [[имя-продукта]], количество: [[количество-продукта]], цена: [[цена-продукта]]

Есть ли что-то вроде "логического раздела" в документе Word для переноса абзаца? если нет, что бы вы посоветовали сделать это?

1 Ответ

1 голос
/ 21 января 2010

Вы можете попробовать запустить слияние отдельно для каждой из ваших строк, а затем объединить результат в один документ. Вот пример метода для объединения многих документов. В этом примере я использую элемент 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;
    }
...