2016-04-22 105 views
0

我試圖插入註釋作爲使用OpenXml的回覆。如果不可能,我想在選定的評論之後插入評論。到目前爲止,我可以在我想要的地方插入評論,但是我無法在打開文檔時顯示評論。OpenXML將註釋回覆插入Word文檔C#

下面是插入評論的代碼。

using (WordprocessingDocument document = WordprocessingDocument.Open(path + fileName + ".docx", true)){ 

      // Locate the first paragraph in the document. 
      //XMLParagraphAlias firstParagraph = document.MainDocumentPart.Document.Descendants<XMLParagraphAlias>().First(); 

      XMLCommentsAlias comments = document.MainDocumentPart.WordprocessingCommentsPart.Comments; 

      string id = comments.Descendants<DocumentFormat.OpenXml.Wordprocessing.Comment>() 
       .Where(i => i.Id.Value == reply.CurrentCommentID.ToString()) 
       .Select(e => e.Id.Value) 
       .First(); 


      // Compose a new Comment and add it to the Comments part. 
      XMLParagraphAlias p = new XMLParagraphAlias(new Run(new Text(reply.ReplyText))); 

      string newCommentID = comments.Descendants<DocumentFormat.OpenXml.Wordprocessing.Comment>().Select(e => e.Id.Value).Max(); 

      XMLCommentAlias cmt = new XMLCommentAlias() 
            { 
            Id = newCommentID, 
            Author = reply.CurrentUserName, 
            Date = DateTime.Now.Date 
            }; 

      XMLCommentAlias comment = comments.Elements<XMLCommentAlias>() 
             .Where(n => n.Id.Value == reply.CurrentCommentID.ToString()) 
             .First(); 

      XMLParagraphAlias test2 = comment.Descendants<XMLParagraphAlias>().First(); 

      cmt.AppendChild(p);   
      comments.AppendChild(cmt); 
      comments.Save(); 

      // Specify the text range for the Comment. 
      // Insert the new CommentRangeStart before the first run of paragraph. 
      test2.InsertBefore(new CommentRangeStart() { Id = reply.CurrentCommentID.ToString() }, test2.GetFirstChild<Run>()); 

      // Insert the new CommentRangeEnd after last run of paragraph. 
      var cmtEnd = test2.InsertAfter(new CommentRangeEnd() { Id = reply.CurrentCommentID.ToString() }, test2.Elements<Run>().Last()); 

      // Compose a run with CommentReference and insert it. 
      test2.InsertAfter(new Run(new CommentReference() { Id = reply.CurrentCommentID.ToString() }), cmtEnd); 
     } 

我可以看到註釋投入使用VS調試器中的文件,但是當我打開該文件沒有顯示它。

保存命令執行後,註釋被添加到文檔,但不顯示。

此處的總體目標是在文檔中包含的評論列表中的特定評論之後插入評論。有人能幫我找到解決辦法嗎?

+1

我建議你創建一個簡單的文檔,帶一個註釋,保存它。現在添加另一個評論(或答覆),並以不同的名稱保存。在Open XML Productivity Tool中打開其中的第一個,然後使用其「比較」功能將其與第二個文檔進行比較。該工具將1)向您顯示底層XML中的差異,以及2)將第一個文檔更改爲第二個文檔所需的代碼。 IOW它應該告訴你如何添加回復(或其他評論)。 –

回答

0

按照邁斯特的建議,我能解決我的問題。標記爲回覆的評論位於commentsExtended.xml文件中。要創建與評論的關係,您需要創建一個CommentEX對象,並將您要插入的評論回覆鏈接到您要回復的評論。實施評論回覆的代碼位於下方。 ParaIdParent屬性是您正在回覆的評論的參數。

 private void BuildCommentExtendXML(WordprocessingDocument document, string randomHexBinaryValue, HexBinaryValue commentsParagraphDescendantId) 
    { 
     var commentsEx = document.MainDocumentPart.WordprocessingCommentsExPart.CommentsEx; 

     CommentEx commentEx = new CommentEx() 
     { 
      ParaId = randomHexBinaryValue, 
      ParaIdParent = commentsParagraphDescendantId, 
      Done = new OnOffValue(false) 
     }; 
     commentsEx.Append(commentEx); 
    }