2017-06-23 21 views
0

更新的问题更具体...您是否可以编程方式在MS Word中的OOXML注入注释中创建HTML链接?

我能够插入自定义注释到使用几个不同的策略的Word文档(见Insert OOXML comment with track changes)或下面的代码(这是传递一个文件位置对此事发表评论.xml和'msg'或要插入的注释)。

但我看不到如何在OOXML中包含可点击的链接。

我可以得到纯文本链接,如果它们是'味精'的一部分...但传递HTML会破坏XML并引发错误。

Word中的链接注释实际上存储在comment.xml.rels中,并且只在实际注释的XML中引用...所以您可能必须将数据追加到comment.xml.rels以编程方式创建一条链接。

任何人都处理了这一点,并能够包括可点击的链接?

这是令人沮丧的......一旦出现包含链接的纯文本评论,您所要做的就是在链接之后键入一个空格,并且它变得可点击。我试图避免这个手册(和丑陋)的一步。

function insertComment2(fileName, msg) { 

    var selectedText = ""; 
    var searchText = ""; 
    var replaceText = ""; 
    var myXML = ""; 

    Office.context.document.getSelectedDataAsync(
Office.CoercionType.Text,function (result) { 
    if (result.status == Office.AsyncResultStatus.Failed) { 
     console.log('Action failed. Error: ' + result.error.message); 
    } 
    else { 
     selectedText = result.value; 
     console.log('Selected data: ' + selectedText); 
     var myOOXMLRequest = new XMLHttpRequest(); 
     myOOXMLRequest.open('GET', fileName, false); 
     myOOXMLRequest.send(); 
     if (myOOXMLRequest.status === 200) { 
      myXML = myOOXMLRequest.responseText; 
      console.log("XML before insertion: " + myXML); 
     } 
     // selectedText = getDataFromSelection(); 
     var searchRangeTxt = "<w:r><w:t xml:space=\"preserve\">selectedText</w:t></w:r>" 
     var replaceRangeTxt = "<w:r><w:t xml:space=\"preserve\">" + selectedText + "</w:t></w:r>" 

     myXML = myXML.replace(searchRangeTxt, replaceRangeTxt); 

     msg = "<![CDATA[" + msg + "]]>"; 

     var searchText = "<w:p><w:r><w:t>comment</w:t></w:r></w:p>"; 
     var replaceText = "<w:p><w:r><w:t>" + msg + "</w:t></w:r></w:p>"; 
     myXML = myXML.replace(searchText, replaceText); 

     // var timeStamp = Date().toLocaleString(); 
     var currentdate = new Date(); 
     var timeStamp = currentdate.getFullYear() + "-" 
         + ("0" + (currentdate.getMonth() + 1)).slice(-2) + "-" 
         + ("0" + currentdate.getDate()).slice(-2) + "T" 
         + currentdate.getHours() + ":" 
         + currentdate.getMinutes() + ":" 
         + currentdate.getSeconds() + "Z"; 

     console.log('Trying to get time and think it is: ' + timeStamp); 

     var searchDate = "<w:comment w:id=\"0\" w:author=\"Proofreading International\" w:date=\"DATE\" w:initials=\"PRI\">"; 
     var replaceDate = "<w:comment w:id=\"0\" w:author=\"Proofreading International\" w:date=\"" + timeStamp + "\" w:initials=\"PRI\">"; 

     myXML = myXML.replace(searchDate, replaceDate); 

     Office.context.document.setSelectedDataAsync(myXML, { coercionType: Office.CoercionType.Ooxml }, function (asyncResult) { 
       if (asyncResult.status == "failed") { 
        console.log("Action failed with error: " + asyncResult.error.message); 
        console.log('Failure in inserting XML!' + myXML); 
       } 
       else { 
       console.log('success in inserting XML!' + myXML); 
       } 
      }); 
     } 
    }); 

}


更新中...

插入下面的 'comment.xml' 文件确实产生在评论一个hoverable超级链接...但它是一个空的超链接,并没有按不接受对该部分的ID引用...

对于纯文本/空Word文档,插入注释并不会创建comments.xml.rels文件。只有在手动创建带有链接的评论时才会创建该文件。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<?mso-application progid="Word.Document"?> 
<pkg:package 
    xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"> 
    <pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512"> 
     <pkg:xmlData> 
      <Relationships 
       xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
       <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/> 
      </Relationships> 
     </pkg:xmlData> 
    </pkg:part> 
    <pkg:part pkg:name="/word/_rels/comments.xml.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="256"> 
     <pkg:xmlData> 
      <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
       <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="http://www.google.com/" TargetMode="External"/> 
      </Relationships> 
     </pkg:xmlData> 
    </pkg:part> 
    <pkg:part pkg:name="/word/_rels/document.xml.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="256"> 
     <pkg:xmlData> 
      <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
       <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/> 
      </Relationships> 
     </pkg:xmlData> 
    </pkg:part> 
    <pkg:part pkg:name="/word/document.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"> 
     <pkg:xmlData> 
      <w:document 
       xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
       <w:body> 
        <w:p> 
         <w:commentRangeStart w:id="0"/> 
         <w:r><w:t xml:space="preserve">selectedText</w:t></w:r> 
         <w:r> 
          <w:commentReference w:id="0"/> 
         </w:r> 
         <w:commentRangeEnd w:id="0"/> 
        </w:p> 
       </w:body> 
      </w:document> 
     </pkg:xmlData> 
    </pkg:part> 
    <pkg:part pkg:name="/word/comments.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"> 
     <pkg:xmlData> 
      <w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
       <w:comment w:id="0" w:author="Proofreading International" w:date="DATE" w:initials="PRI"> 
        <w:p> 
        <w:r> 
        <w:t> 
         New comment 
        </w:t> 
        </w:r> 
        <w:hyperlink Id="rId2" w:history="1"> 
        <w:r> 
        <w:rPr> 
        <w:rStyle w:val="Hyperlink"/> 
        </w:rPr> 
        <w:t>Google</w:t> 
        </w:r> 
        </w:hyperlink> 
       </w:p> 
       </w:comment> 
      </w:comments> 
     </pkg:xmlData> 
    </pkg:part> 
</pkg:package> 

回答

0

我建议你做的是以下几点:

  1. 手动插入注释的链接,就像你想要它。
  2. 选择包含注释的范围,然后使用API​​获取与其关联的OOXML。下面是如何做到这一点的一个示例:

var myOOXML=""; 
 
    function getOOXML() { 
 
     Office.context.document.getSelectedDataAsync("ooxml", {}, function (result) { 
 
      myOOXML = result.value; 
 
      document.getElementById("txtTest").value = result.value 
 
     }) 
 

 

 
    }

  • 抢OOXML并尝试使用tips on this article将其最小化。同时寻找文字和网址,以便您可以用您需要的替换它。

  • 最后,现在您知道需要替换的文本,请务必使用与此类似的代码将OOXML插入需要的位置。

  • Word.run(function (ctx) { 
     
    
     
          var myTempOOXML = document.getElementById("txtTest").value; 
     
          //replaces the selected range with OOXML 
     
          ctx.document.getSelection().insertOoxml(myTempOOXML, "replace"); 
     
          return ctx.sync(); 
     
    
     
    
     
         }).catch(function (e) { app.showNotification(e.message)}) 
     
        

    希望这设置你在正确的道路...... 感谢! 胡安。

    +0

    噢,我的 - 谢谢胡安。 – 11teenth

    +0

    我不得不填补很多 - 我的技能很薄弱。 但我得到一个环节的工作... 两个主要变化: 的comment.xml.rels封装元件发生下面的评论文字... 并有一些其他风格的标签......像 我已经做了一些波兰工作并理顺了格式化......但我想我正在路上。 – 11teenth

    +0

    很高兴听到!现在你可以处理任何OOXML :) –

    相关问题