2014-04-17 2 views
1

제목에 모두 나와 있지만 자세히 설명하겠습니다. 여기 있습니다.mergefield에서 값 얻기 C# Word VSTO

현재 템플릿의 병합 필드를 사용하는 Word VSTO 추가 기능에서 추가 코드를 개발 중입니다. 템플릿의 병합 필드는 외부 파일의 데이터를 사용하여 채 웁니다. Merge Field에서 값을 읽는 것이 필요하지만이 작업을 수행하는 방법은 전혀 없습니다. 지금은 몇 일을 찾고 있지만 봤는데 내가 나를 위해 일한 읽기 기사 없음 ...

그래서 질문 : 내가 VSTO를 사용하여 Word에서 특정 병합 필드에서 값을 얻을 수있는 방법

?

답변

1

편지 병합 여기에, VSTO에서 매우 간단 here

이 코드 블록은 문서의 모든 필드를 검색합니다 나는 다른 모든 예를 발견

//Pass in the path of external file  
document.MailMerge.OpenDataSource(Name: vm.FilePath.FullName); 
document.MailMerge.Destination = WdMailMergeDestination.wdSendToNewDocument; 

을 할 것 두 가지 마법 라인입니다

public static List<string> GetFieldsUsedInDocument(Document document) 
     { 
      var fields = new List<string>(); 

      foreach (MailMergeField fld in document.MailMerge.Fields) 
      { 
       if (fld.Code != null) 
       { 
        fields.Add(fld.Code.Text.ToUpper()); 
       } 
      } 
      return fields; 
     } 

위에 반환 된 필드 목록에서 MergeField 이름을 가져 오려면 GetFieldsUsedInDocument

public static List<string> GetMergeFields(List<string> allFields) 
     { 
      var merges = new List<string>(); 

      foreach (var field in allFields) 
      { 
       var isNestedField = false; 
       foreach (var fieldChar in field) 
       { 
        int charCode = fieldChar; 
        if (charCode == 19 || charCode == 21) 
        { 
         isNestedField = true; 
         break; 
        } 
       } 
       if (!isNestedField) 
       { 
        var fieldCode = field; 
        if (fieldCode.Contains("MERGEFIELD")) 
        { 
         var fieldName = fieldCode.Replace("MERGEFIELD", string.Empty).Replace('"', ' ').Trim(); 
         var charsToGet = fieldName.IndexOf(" "); 
         if (charsToGet < 0) 
          charsToGet = fieldName.IndexOf(@"\"); 

         charsToGet = charsToGet > 0 ? charsToGet : fieldName.Length; 

         fieldName = fieldName.Substring(0, charsToGet); 

         if (!merges.Contains(fieldName)) 
         { 
          merges.Add(fieldName); 
         } 
        } 
       } 
      } 
      return merges; 
     } 
+0

이 여전히 내 질문에 대답하지 않습니다 ... 병합 필드에서 값을 검색 할 필요가 실제로 데이터 원본으로 필드를 병합 할 필요가 없습니다. – JRO

+1

대답을 mergefield 이름을 얻으려면 – Kiru

+0

" allFields"를 채우는 방법을 게시 할 수도 있습니까? – JRO

관련 문제