2016-08-27 1 views
0

편지 병합 필드가 포함 된 여러 텍스트 상자를 사용하는 단어 문서가 있습니다.C#으로 Microsoft Word 텍스트 상자에 병합하는 메일

내가 만든 시스템을 사용하여 프로그래밍 방식으로 Word 문서로 편지를 병합하려는 경우 문서의 편지 병합 필드를 검색 한 다음 편지 병합 필드에 적절한 값을 삽입하고 문서를 저장합니다. 새 파일로.

Document.StoryRanges 

를 사용하여

나는 1 개 텍스트 상자에 대해 위의 과정을 할 수 있어요.

하지만 여러 개의 텍스트 상자를 만들면 일관되게 텍스트 상자 중 하나에 값을 삽입하는 것처럼 보입니다. 값을받는 texbox는 변경되지 않습니다. 해당 텍스트 상자를 삭제하려고하면 메일 병합 프로세스가 작동하지 않으며 다른 텍스트 상자를 사용하여 작동하도록해야합니다. 예를 들어, 텍스트 상자를 뒤로 가져온 다음 시스템이 텍스트 상자에만 편지 병합하도록 전달해야합니다.

각 텍스트 상자에 들어가기 위해 foreach 루프를 많이 만들지 않으려 고 시도했습니다. 그래서 일부 디버깅을 수행하고 시스템이 전체 문서와 텍스트 상자 중 하나를 StoryRanges으로 읽는 것으로 나타났습니다.

답변

1

다음은 최근에 사용한 해결책입니다. Document.Shapes를 통해 편지 병합 필드로 이동할 수 있습니다. 나는 여기서 무슨 일이 일어나는지 정확히 알지 못한다. 그러나 그것은 나를 위해 일했다.

public static List<Field> getMailMergeFields(Document document) 
{ 
    List<Field> mailMergeFields = new List<Field>(); 
    foreach (Shape shape in document.Shapes) 
    { 
     if (shape.TextFrame.HasText != 0) 
     { 
      foreach (Field field in shape.TextFrame.ContainingRange.Fields) 
      { 
       if (isMailMergeField(field)) mailMergeFields.Add(field); 
      } 
     } 
    } 
    foreach (Field field in document.Fields) 
    { 
     if (isMailMergeField(field)) mailMergeFields.Add(field); 
    } 
    return mailMergeFields; 
} 

public static bool isMailMergeField(Field field) 
{ 
    string fullField = field.Code.Text.Trim(); 
    if (!fullField.StartsWith("MERGEFIELD")) return false; 
    if (!fullField.EndsWith(@"\* MERGEFORMAT")) return false; 
    return true; 
} 

희망이 있습니다.