2016-12-22 5 views
2

문서를 생성하기위한 템플릿으로 Microsoft Word 파일을 사용하는 응용 프로그램을 만들고 있습니다. 병합 필드를 사용하여 내 문서에 데이터를 가져옵니다.Open XML SDK를 사용하여 FieldChar에서 결과 설정

SimpleField 그것의 결과는 매우 쉽게 설정 할 수 있습니다 필드가 Word에서 스타일 때

SimpleField f = doc.MainDocumentPart.Document.Body.Descendants<SimpleField>().First(); 
f.RemoveAllChildren(); 
f.Append(new Run(new Text("somevalue"))); 

하지만은, 조금 더 복잡입니다 FieldChar으로 저장합니다. 위의 방법은 결과가 자식이 아니기 때문에 작동하지 않지만 형제가됩니다.

그래서 기본적으로 질문 : Open XML SDK를 사용하여 필드 (모든 유형)의 결과를 설정하려면 어떻게해야합니까?

답변

1

가장 간단한 방법은 문자열 바꾸기입니다. 템플릿을 제어 할 수 있으므로 병합 필드에 고유 한 문자열을 입력하십시오. 병합 필드가 포맷되어 있는지 여부와 관계없이 바꿀 텍스트는 Text 요소에 있습니다.

Body의 모든 텍스트 하위 항목을 WordprocessingDocument으로 검색하고 문자열 바꾸기를 수행하십시오.

다음은 팩스 병합 문서 템플릿입니다. 나는«XXXXBusiness PhoneXXXX»를 위해 비즈니스 전화 병합 필드를 변경하고 다르게 포맷 한 :

using System.Linq; 
using DocumentFormat.OpenXml.Wordprocessing; 
namespace OxmlApp 
{ 

    static class WordprocessingExtensions 
    { 
     public static void ReplaceTextInTextDescendants(this Body body, string oldText, string newText) 
     { 
      foreach (var textItem in body.Descendants<Text>().Where(textItem => textItem.Text.Contains(oldText))) 
      { 
       textItem.Text = textItem.Text.Replace(oldText, newText); 
      } 
     } 
    } 
} 

:

enter image description here

가 나는과 같이 대체 할 수있는 Body 클래스에 대한 확장 방법을 썼습니다 일단이 코드가 완성되면 문서를 연 다음 코드가 한 줄짜리 코드가됩니다.

using (var doc = WordprocessingDocument.Open(openFileDialog.FileName, true)) 
{ 
    doc.MainDocumentPart.Document.Body.ReplaceTextInTextDescendants("«XXXXBusiness PhoneXXXX»","212-867-5309"); 
} 

결과는 s입니다. 여기 EEN :

enter image description here

을 완료!