2010-08-10 4 views
13

뭔가 필요한 것이 있습니다. 처음에는 Content Control을 솔루션으로 생각했지만 그 중 일부 문제가 있습니다.OpenXML의 컨텐츠 컨트롤 바꾸기

그런 다음 .docx에 CustomXML을 추가하는 방법을 살펴 보았지만 i4i 소송으로 인해 CustomXML을 추가하지 않았습니다.

그렇다면 OpenXML SDK 2.0을 통해 콘텐츠 컨트롤의 텍스트를 간단히 변경하겠다고 결정했으나 콘텐츠 컨트롤이 사라지지 않는 경우에도 마찬가지입니다. 나는 그것이 단어 내부에서 발생하지 않으면 텍스트가 변경되었음을 알지 못한다고 생각합니다.

난 그냥 CC를 제거하고 대신 텍스트를 배치 할 수 있지만 가져올 수있는 형식 및 스타일 문제가 두려워 콘텐츠 컨트롤의 목적을 무시합니다.

그런 다음 Word에서 인식 할 수있는 자체 자리 표시자를 정의 할 수 있는지 궁금해하기 시작했습니다. 빌딩 블록을 통해 아마. OpenXML을 사용하여 쉽게 찾을 수있는 것을 제외하고는 아무 것도 할 필요가 없습니다. Building Block을 사용하여 수행 할 수있는 작업이 무엇인지 확신 할 수는 없지만 실제로 수행 할 수 있기를 기대합니다.

확실하지 나를 위해 최선하지만 내가 필요로하는 것은 것이 무엇 솔루션 :

는) 템플릿에 배치 할 쉽게 뭔가, 아마 미리 정의 된 콘텐츠 컨트롤의 자리 당신이 wan't과 스타일을 어디에 배치 할 수 당신이 원하는대로.

b) 데이터가 추가되면 모든 자리 표시자를 제거하므로 다시 수정되지 않습니다. 자리 표시 자에 정의 된 스타일/형식을 유지합니다. 요약하자면

, 나는 텍스트가 추가 된 후 그들은 제거 할 수 있도록 내가 OpenXML과 SDK에 콘텐츠 컨트롤을 편집 할 수있는 방법 중 하나

에 대답해야합니다.

- 또는

나는 그때 대체 할 수있는 Word 문서에 대한 내 자신의 사용자 정의의 OpenXML 태그를 정의 할 수 있습니까?

답변

7

아마도이 당신을 도울 수,

private void DeleteSdtBlockAndKeepContent(MainDocumentPart mainDocumentPart, string sdtBlockTag) 
    { 
     List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList(); 
     SdtBlock sdtA = null; 

     foreach (SdtBlock sdt in sdtList) 
     { 
      if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag) 
      { 
       sdtA = sdt; 
       break; 
      } 
     } 


     OpenXmlElement sdtc = sdtA.GetFirstChild<SdtContentBlock>(); 
     OpenXmlElement parent = sdtA.Parent; 

     OpenXmlElementList elements = sdtc.ChildElements; 

     var mySdtc = new SdtContentBlock(sdtc.OuterXml); 

     foreach (OpenXmlElement elem in elements) 
     { 

      string text = parent.FirstChild.InnerText; 
      parent.Append((OpenXmlElement)elem.Clone()); 
     } 

     sdtA.Remove(); 
    } 
+1

네, 이미 비슷한 것을 해줬고 반복 된 텍스트와 다른 내부 sdtRun에 대한 블록 내부에 테이블을 배치하고 설정할 경로가있는 데이터 XML을 기반으로 바꿨습니다. 내용 태그. –

1

이 필드를 사용하여 살펴보십시오. 편지 병합 필드는이 용도로만 설계되었습니다.

+0

나는 그것을 조사 할 것이다. 내가 stdRun 및 stdBlock과 함께 작동하도록 만들었지 만 Doc가 생성 될 때 항상 그렇게 나타나는 것은 아닙니다. –

+0

우리는보고 시스템 (Windward)에서이를 수행하며 정상적으로 작동합니다.자세히 작성중인 docx 파일의 유효성을 확인하십시오. –

1

OpenXML SDK를 사용하여 ContentControl/SDT를 수정할 때 자동으로 ContentControl/SDT를 제거하는 솔루션에만 관심이 있거나 프로그래밍 방식으로 내용을 수정 한 후에 ContentControl/SDT가 사라지게할지 여부는 궁금합니다. 사용자에 의해.

전자의 경우 이전에 직접 제거해야한다고 생각합니다. as Bilel suggested. 후자의 경우이 속성을 확인해야합니다 : ContentControl.Temporary ("사용자가 컨트롤을 입력 할 때 또는 컨트롤의 텍스트가 프로그래밍 방식으로 변경되면 ContentControl이 자동으로 삭제됩니다 .ContentControl이 문서에서 자동으로 삭제되면 텍스트 컨트롤에서 문서에 남아 있습니다. ")