2016-07-02 6 views
0

Как сообщить об ошибке в API javascript Office.js/Word?Ошибка в методах insertOoxml в Office.js/Word Javascript API

Ошибка в том, что при попытке вставить якорь-подобную закладку через range.insertOoxml (...) или context.document.body.insertOoxml (...) api указывает на успех, однако полученный документ не имеет закладки. Единственным обходным решением является вставка дополнительного абзаца после абзаца с якорем. К сожалению, это приводит к дополнительным прерываниям в теле, которое убивает опыт.

По сути, это не удается молча ...

<w:body> 
<w:p> 
<w:bookmarkStart w:id="0" w:name="bookmarkAnchor"/> 
<w:bookmarkEnd w:id="0"/> 
</w:p> 
</w:body> 

... но это работает ....

<w:body> 
<w:p> 
<w:bookmarkStart w:id="0" w:name="bookmarkAnchor"/> 
<w:bookmarkEnd w:id="0"/> 
</w:p> 
<w:p/> <--- this is a miserable workaround! 
</w:body> 

Я счастлив загрузить некоторые тестовый код, который показывает эту проблему.

ответ

0

спасибо, что отправил этот вопрос. 3 вопроса здесь:

  1. Прежде всего то, что XML описано в вашем образце в WordprocessingML, а не OOXML. Ожидается, что insertOoxmlmethod получит полный Office Open XML.

  2. Это сказало ... Я нашел немного другое представление OOXML для вашего образца, это работает без добавления нового абзаца, см. Пример ниже.

  3. Почему вы используете закладки? с точки зрения разработчика его супер ненадежный, чтобы использовать их, я настоятельно рекомендую вам использовать элементы управления содержимым. Закладки супер легко ломаются конечными пользователями.

ИТАК первую очередь здесь разметки я использую:

<?xml version="1.0" 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/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:rsidR="00000000" w:rsidRDefault="005C4C17"> 
 
      <w:bookmarkStart w:id="0" w:name="MyBookmark"/> 
 
      <w:r> 
 
       <w:t>provides</w:t> 
 
      </w:r> 
 
      <w:bookmarkEnd w:id="0"/> 
 
      </w:p> 
 
      <w:sectPr w:rsidR="00000000"> 
 
      <w:pgSz w:w="12240" w:h="15840"/> 
 
      <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/> 
 
      <w:cols w:space="720"/> 
 
      </w:sectPr> 
 
     </w:body> 
 
     </w:document> 
 
    </pkg:xmlData> 
 
    </pkg:part> 
 
</pkg:package>

и вот код:

function insertOOXMLwithBookmark() { 
 

 
     Word.run(function (context) { 
 
      var myOOXML = "<?xml version='1.0' 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/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:rsidR='00000000' w:rsidRDefault='005C4C17'> <w:bookmarkStart w:id='0' w:name='MyBookmark'/> <w:r> <w:t>provides</w:t> </w:r> <w:bookmarkEnd w:id='0'/> </w:p> <w:sectPr w:rsidR='00000000'> <w:pgSz w:w='12240' w:h='15840'/> <w:pgMar w:top='1440' w:right='1440' w:bottom='1440' w:left='1440' w:header='720' w:footer='720' w:gutter='0'/> <w:cols w:space='720'/> </w:sectPr> </w:body> </w:document> </pkg:xmlData> </pkg:part> </pkg:package>"; 
 

 
      context.document.getSelection().insertOoxml(myOOXML, "replace"); 
 
      return context.sync();

Код примера просто заменяет текущий выбор или добавляет его в точку ввода (диапазон в основном), но, конечно, вы можете повторно использовать этот точно такой же метод в любом объекте, который поддерживает диапазон . Сообщите мне, если это работает для вы и счастливое кодирование !!!

Кстати я написал статью об этом, что вы могли бы оказаться полезными: http://dev.office.com/docs/add-ins/word/create-better-add-ins-for-word-with-office-open-xml

+0

Juan - спасибо за Ваш ответ, но, к сожалению, это не работает. Позвольте мне объяснить ... идея состоит в том, чтобы вставить закладку «якорь», которая ничего не значит между элементами bookmarkStart и bookmarkEnd. Если вы откроете слово и поместите каретку между двумя символами, и пусть Word вставляет закладку, вы увидите, что я имею в виду. В закладке ничего нет, она просто дает вам возможность вернуться назад. – Ron

+0

продолжение Я отвечу на ваши 3 вопроса (1) yes, insertOoxml принимает OPC; OOXML - это WordProcessingML, SpreadsheetML, PresentationML.Я честно думаю, что это плохо названная функция (2) см. Мой комментарий выше, да, что работает, но это, к сожалению, не то, что я пытаюсь сделать (3), здесь есть более длинная история, я использую оба, суть истории что элементы управления содержимым снабжены визуальным поведением, которое нежелательно для всей структуры, которую мне нужно пометить в документе. Закладки - это не только единственный вариант, но они в стандарте, и у них отличное редактирование. – Ron

+0

Поведение закладок хорошо описано здесь: [link] (https://support.office.com/en-us/article/Add-or-delete-bookmarks-f68d781f-0150-4583-a90e-a4009d99c2a0?ui=en- США и Rs = EN-US и объявления = US & fromAR = 1). Они также могут отображаться или скрываться пользователями через меню «Параметры». Кроме того, программно они могут быть скрыты от основного экрана отображения, даже когда пользователь решает показать их с помощью опций, указав им уникальное имя, которое начинается с «_»; которые могут быть созданы только программно. Я должен полагать, что другие используют их для определения структуры в документе (например, процесс публикации). – Ron