2014-10-04 7 views
0

단어 단락, 단락 내용 및 주석 내용 (있는 경우)을 제외하고 약간의 방법이 있습니다. 문서의 어느 단락을 처리했는지 추적하는 수단으로 openxml injection 문단에 내용 컨트롤을 추가하려고합니다. 그것은 폭발하고 난 정확히 openxml에 새로운 사람으로서 어디서부터 시작 해야할지 잘 모르겠습니다. 내 코드 샘플은 다음과 같습니다.기존 단락에 콘텐츠 컨트롤 추가

public void Handle(Paragraph paragraph, string docPartXml, string commentsPartXml) 
    { 

     var docXml = docPartXml; 
     var commentsXml = commentsPartXml; 

     using (var res = paragraph.Range.WithComCleanup()) 
     { 
      var range = res.Resource; 
      using (var packageStream = range.GetPackageStreamFromRange()) 
      using (var document = WordprocessingDocument.Open(packageStream, true)) 
      { 
       var pbody = document.MainDocumentPart.Document.Body; 
       pbody.InnerXml = docXml + "<w:p></w:p>"; // paragraphs are merged/combined w/o this 
       document.MainDocumentPart.Document.Save(); 

       WordprocessingCommentsPart commentsPart = null; 
       if (document.MainDocumentPart.WordprocessingCommentsPart == null) 
       { 
        commentsPart = document.MainDocumentPart.AddNewPart<WordprocessingCommentsPart>(); 
        document.MainDocumentPart.AddPart(commentsPart); 
        document.MainDocumentPart.Document.Save(); 
        commentsPart = document.MainDocumentPart.WordprocessingCommentsPart; 
        commentsPart.Comments = new Comments(); 
       } 
       if (commentsPart == null) 
        commentsPart = document.MainDocumentPart.WordprocessingCommentsPart; 

       commentsPart.Comments.InnerXml += commentsXml; 
       commentsPart.Comments.Save(); 

       document.MainDocumentPart.Document.Save(); 

       document.Package.Flush(); 
       XDocument xdoc = OpenXmlExtensions.OpcToFlatOpc(document.Package); 
       var openxml = xdoc.ToString(); 

       var validator = new OpenXmlValidator(); 
       var errors = validator.Validate(document); 

       // todo - provide more detailed info for the log 
       foreach (var err in errors) 
        _logger.Warn(err.Description, "OpenXml Injection"); 

       try 
       { 
        range.InsertXML(openxml); 
       } 
       catch (COMException e) 
       { 
        _logger.Error("Unable to insert xml into paragraph"); 
       } 
      } 
     } 
    } 

답변

0

pbody.InnerXml = ... 코드 줄을 다음과 같이 바꾸면 올바르게 작동합니다.

pbody.RemoveAllChildren<Paragraph>(); 
pbody.RemoveAllChildren<SdtBlock>(); 
pbody.RemoveAllChildren<SdtProperties>(); 
var sdtBlock1 = new SdtBlock(); 
var sdtPr = new SdtProperties(
    new SdtAlias {Val = string.Format("{0}-{1}", "CC", hash)}, 
    new Tag {Val = string.Format("{0}-{1}", hash, "CC")}); 
         //new Lock(){ Val = LockingValues.ContentLocked}); 
sdtBlock1.AppendChild(sdtPr); 
var sdtContentBlock1 = new SdtContentBlock { 

InnerXml = docXml}; 
sdtBlock1.AppendChild(sdtContentBlock1); 

pbody.AppendChild(sdtBlock1);