Word插件开发中使用OOXML插入带自定义样式文本不生效问题求助
问题原因
- 核心错误1:XML字符被错误转义
你在JS模板字符串中将OOXML的尖括号全部转义为了HTML实体(<对应<、>对应>),insertOoxml方法接收到的是无法解析的非标准XML字符串,自然无法识别其中的样式定义。 - 核心错误2:自定义样式缺少必要属性
你定义的TestParagraphStyle段落样式没有继承Word默认的Normal基础样式,也没有添加w:qFormat标记,Word插入内容时会将其识别为无效样式,直接用默认格式渲染文本。
修复方案
- 先将模板字符串中所有HTML实体替换回原始XML字符:
- 把所有
<替换为< - 把所有
>替换为> - 把所有
"替换为"
- 把所有
- 在
styles.xml的样式定义节点下补充两个必要子节点:<w:basedOn w:val="Normal"/> <w:qFormat/>
修复后完整代码
// 创建文档正文的代理对象 var 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/_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/styles" Target="styles.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:pStyle w:val="TestParagraphStyle"/> </w:pPr> <w:r> <w:t xml:space="preserve">This text should be styled</w:t> </w:r> </w:p> </w:body> </w:document> </pkg:xmlData> </pkg:part> <pkg:part pkg:name="/word/styles.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"> <pkg:xmlData> <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" > <w:style w:type="paragraph" w:styleId="TestParagraphStyle"> <w:name w:val="Test Paragraph Style"/> <!-- 补充的两个必要属性 --> <w:basedOn w:val="Normal"/> <w:qFormat/> <w:pPr> <w:spacing w:line="480" w:lineRule="auto"/> <w:ind w:firstLine="1440"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Courier New" w:hAnsi="Courier New"/> <w:color w:val="FFF200"/> <w:sz w:val="40"/> </w:rPr> </w:style> </w:styles> </pkg:xmlData> </pkg:part> </pkg:package> `, Word.InsertLocation.start ); // 同步执行队列中的指令,完成后返回Promise return context.sync().then(function () { console.log('OOXML已添加到文档正文开头。'); });
验证方法
运行代码后打开Word的样式面板,可看到新增的「Test Paragraph Style」样式,插入的文本会自动应用该样式:20号大小、Courier New字体、黄色、首行缩进2字符、1.5倍行距。
内容的提问来源于stack exchange,提问作者user16712216
相关产品推荐
相关产品推荐

