使用Office JavaScript API的.insertOoxml插入<w:keepNext/>无效,如何让选中段落同页?
解决Word加载项中insertOoxml插入<w:keepNext/>不生效的问题
你遇到的问题主要有两个核心原因:
- 代码里的
<w:keepNext/>被错误包裹了markdown加粗符号**,破坏了OOXML的结构,导致Word无法识别该标签。 <w:keepNext/>的作用是让当前段落与下一个段落保持在同一页,如果只插入单个段落,这个标签不会产生任何视觉效果,必须至少有两个连续段落,且给前一个段落添加该标签。
方案一:修正OOXML内容
先移除OOXML字符串中<w:keepNext/>前后的**,同时添加至少两个段落,给第一个段落设置<w:keepNext/>。修正后的代码如下:
await Word.run(async (context) => { const body = context.document.body; // 修正后的OOXML:移除多余的**,并添加两个关联段落 body.insertOoxml( "<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:pPr><w:keepNext/><w:spacing w:before='360' w:after='0' w:line='480' w:lineRule='auto'/></w:pPr><w:r><w:rPr><w:color w:val='70AD47' w:themeColor='accent6'/></w:rPr><w:t>第一段:已设置keepNext,将与下一段保持在同一页</w:t></w:r></w:p><w:p><w:pPr><w:spacing w:before='360' w:after='0' w:line='480' w:lineRule='auto'/></w:pPr><w:r><w:rPr><w:color w:val='70AD47' w:themeColor='accent6'/></w:rPr><w:t>第二段:与第一段绑定在同一页</w:t></w:r></w:p></w:body></w:document></pkg:xmlData></pkg:part></pkg:package>", Word.InsertLocation.start ); await context.sync(); console.log("添加带keepNext的OOXML段落成功"); });
方案二:直接使用Office JavaScript API(更推荐,适合初学者)
不需要编写复杂的OOXML,直接通过Office JS的段落属性设置keepNext,操作更简单且不易出错。如果要给选中的所有段落设置保持在同一页,代码如下:
await Word.run(async (context) => { // 获取选中的段落集合 const selectedParagraphs = context.document.getSelection().paragraphs; selectedParagraphs.load("keepNext"); await context.sync(); // 给每个选中的段落设置keepNext(最后一个段落无需设置,因为没有下一段) for (let i = 0; i < selectedParagraphs.items.length - 1; i++) { selectedParagraphs.items[i].keepNext = true; } await context.sync(); console.log("已设置选中段落保持在同一页"); });
说明:最后一个段落不需要设置keepNext,因为它没有后续段落,设置后也不会生效。
内容的提问来源于stack exchange,提问作者SEB0123456
相关产品推荐
相关产品推荐

