2012-08-08 3 views
0

OpenXML을 처음 사용하며이 문제에 관해 머리를 쓰려고합니다. 도움말 정말 감사하겠습니다.OpenXML을 사용하여 Word에서 콘텐츠 컨트롤을 채울 수 없습니다.

개요 나는 asp.net을 통해 word document content template을 채우려고합니다.

필자는 CustomXML을 사용하여 필드를 쉽게 채울 수 있었지만 채우려는 문서도 SharePoint 문서 라이브러리와 매핑됩니다. 그래서 SharePoint 라이브러리에서 문서를 업로드하면 Word 문서의 내용 컨트롤에서 열을 자동으로 채 웁니다. 이제 사용자 정의 XML을 사용하면 해당 설정이 손상됩니다. 그리고 컨트롤이 SharePoint에 매핑 될 때 OpenXML을 사용하여 데이터를 채우는 것이 작동하지 않습니다.

샘플 코드 또는 올바른 방향으로 도움주세요.

답변

0

이것은 우리가 프로젝트에서했던 것과 정확히 같습니다 :) 행운이 있습니다.

먼저 해당 문서 라이브러리에 대한 이벤트 수신자를 작성해야합니다. ItemUpdated 및 ItemAdded를 구현해야합니다. http://www.dotnetcurry.com/ShowArticle.aspx?ID=649 http://blogs.msdn.com/b/brianwilson/archive/2007/03/05/part-1-event-handlers-everything-you-need-to-know-about-microsoft-office- 셰어 포인트 포털 서버 - 이끼 이벤트 handlers.aspx

..이 콘텐츠 컨트롤의 사용자 이름과 값을 제공하는 이벤트 수신기

은 // 코드

Dictionary<string, string> results = new Dictionary<string, string>(); 
      using (Stream stream = file.OpenBinaryStream(SPOpenBinaryOptions.SkipVirusScan)) { 

       using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true)) { 
        var contentControls = doc.MainDocumentPart 
         .GetXDocument() 
         .Descendants(w + "sdt"); 

        foreach (var contentControl in contentControls) 
        { 
         string key = (string)contentControl.Descendants(w + "sdtPr").Elements(w + "alias").Attributes(w + "val").FirstOrDefault(); 
         string val = GetTextFromContentControl(contentControl); 
         results[key] = val; 
        } 

} 

static string GetTextFromContentControl(XElement contentControlNode) { 
      return contentControlNode.Descendants(w + "p") 
       .Select 
       (
        p => p.Elements() 
          .Where(z => z.Name == r || z.Name == ins || z.Name == br) 
          .Descendants() 
          .Where(z => z.Name == w + "t" || z.Name == w + "br") 
          .StringConcatenate(element => (string)element + (element.Name == w + "br" ? Environment.NewLine : "")) + Environment.NewLine 
       ).StringConcatenate(); 
     } 
관련 문제