2009-10-06 6 views
0

MS Word 문서에 정의 된 MergeFields를 외부 데이터 소스의 데이터로 채우는 C# 응용 프로그램을 만듭니다.단어 템플릿의 섹션을 여러 필드로 바꾸는 방법 C#

OpenXml SDK를 사용하고 있으며 단일 필드를 바꿀 때 모든 것이 잘 작동합니다.

내가 원하는 것은 여러 개의 MergeField가 정의 된 섹션을 만들고 입력 데이터에 따라 이러한 섹션을 여러 번 복사 할 수 있다는 것입니다.

문서에 여러 MergeFields가있는 제품 정보가 포함 된 단락을 사용할 수 있지만 여러 제품에 대한 정보가있는 데이터에서 제품이 입력 데이터에있는만큼 출력 단락을 생성하려고합니다.

제품 : [[제품 이름], 양 : [[제품 크기], 가격 : [[제품 가격]

Word 문서에서 "논리적"절 같은 것이 있나요 문단을 감쌀까요? 그렇지 않다면 어떻게해야할까요?

답변

1

각 행을 별도로 병합 한 다음 결과를 하나의 문서로 연결해 볼 수 있습니다. 다음은 많은 문서를 결합하는 샘플 방법입니다. 이 예에서는 분리 요소를 사용하여 분리 할 수 ​​있지만 반드시 필요하지는 않습니다.

 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; 
    }