2014-11-28 1 views
2

Microsoft Word (Microsoft.Office.Interop.Word dll) 및 C#을 사용하여 IF 문을 구현하려고합니다. 나는 다음과 같이 템플릿이 -
template imageMicrosoft Word에서 mergefield 문이 작동하지 않습니다.

을 나는 다음과 같은 결과를 얻고있다 -
template result image

내 코드는 다음과

Dictionary<String, String> valueDic = new Dictionary<string, string>(); 
valueDic.Add("Gender", "Male"); 
Object oMissing = System.Reflection.Missing.Value; 
Object oTemplatePath = @"E:\\ContactTemplate2.docx"; 
Application wordApp = new Application(); 
Document wordDoc = new Document(); 
wordDoc = wordApp.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); 
foreach (Field myMergeField in wordDoc.Fields) 
{ 
    Range rngFieldCode = myMergeField.Code; 
    String fieldText = rngFieldCode.Text; 
    if (fieldText.StartsWith(" MERGEFIELD")) 
    { 
    Int32 endMerge = fieldText.IndexOf("\\"); 
    Int32 fieldNameLength = fieldText.Length - endMerge; 
    String fieldName = fieldText.Substring(11, endMerge - 11); 
    fieldName = fieldName.Trim(); 
    if (valueDic.ContainsKey(fieldName)) 
    { 
     myMergeField.Select(); 
     wordDoc.Application.Selection.TypeText(valueDic[fieldName]); 
    } 
    else 
    { 
     myMergeField.Select(); 
     wordDoc.Application.Selection.TypeText(" "); 
    } 
    } 
} 
wordDoc.SaveAs(@"E:\\myfile.docx"); 
wordApp.Application.Quit(); 

처럼 내가 같은 결과를 원하는 -
expected result

누군가 나를 도와 줄 수 있습니까?

답변

0

그래서 MERGEFIELD 필드 이름이 valueDic 목록에있는 경우 병합 필드를 해당 이름으로 바꾸시겠습니까?

그렇다면, 나는 당신이 필요로하는 다음 일은이 같은 (당신이 구문을 수정해야 할 수도 있습니다)

if (valueDic.ContainsKey(fieldname)) 
{ 
    Range rngFieldResult = myMergeField.Result; 
    myMergeField.Unlink(); 
    Range.Text = valueDic[fieldName]; 
} 

것은 또한 당신이 삭제 경우 필드의 반복이 계속 작동 여부를 확인해야 할 것입니다 제안 컬렉션 멤버. 그렇지 않은 경우 카운터를 사용하여 거꾸로 반복해야 할 것입니다. 당신이

(참고를 사용하는 당신은 또한 범위의의 TextRetrievalMode의 IncludeFieldCodes 및 IncludeHiddenText 속성에주의를 지불해야 할 수도 있습니다 :이 작업을 수행 할 경우 Word가 해석합니다 {IF 남성 = "남성"}로 이 아닌 문자열 비교 " 북마크가"남성 "인 경우 북마크 값이"남성 "과 비교됩니다.

관련 문제