Office JS开发:如何为新建Word文档添加自定义属性
解决Word插件中为新建文档添加自定义属性的问题
我明白你遇到的困扰——给已打开的文档加自定义属性很顺畅,但用createDocument创建新文档时添加属性就触发General Exception,这其实是操作时机和对象引用的问题导致的。
问题根源
你之前的代码顺序有误:在调用myNewDoc.open()之前,文档只是在内存中生成了对象,并没有被Word实例完全初始化,也没有成为活动文档。此时直接访问和修改它的自定义属性,会因为文档的属性集合还未加载到API上下文中而报错。而且当文档在新窗口打开后,原来的myNewDoc对象可能无法直接继续操作,需要重新获取活动文档的引用。
修正后的实现代码
下面是调整后的正确流程:先创建并打开文档,再获取激活的新文档实例,最后添加自定义属性:
getDocumentAsBase64(function(data) { Word.run(function(context) { // 1. 在内存中创建新文档对象 var myNewDoc = context.application.createDocument(data); return context.sync() .then(function() { // 2. 打开新文档,使其成为活动文档 myNewDoc.open(); return context.sync(); }) .then(function() { // 3. 获取当前激活的新文档实例 var activeNewDoc = context.application.activeDocument; // 加载文档的自定义属性集合(必须先加载才能操作) activeNewDoc.properties.customProperties.load(); return context.sync(); }) .then(function() { // 4. 为新文档添加自定义属性 var activeNewDoc = context.application.activeDocument; activeNewDoc.properties.customProperties.add("custom", "prop"); activeNewDoc.properties.customProperties.add("fileId", "your-file-id"); activeNewDoc.properties.customProperties.add("attachId", "your-attach-id"); return context.sync(); }) .catch(function(myError) { updateStatus(myError.message); if (myError instanceof OfficeExtension.Error) { console.log("Error code and message: " + JSON.stringify(myError.debugInfo)); } }); }).catch(function(myError) { updateStatus(myError.message); if (myError instanceof OfficeExtension.Error) { console.log("Error code and message: " + JSON.stringify(myError.debugInfo)); } }); });
关键注意事项
- 操作顺序:必须先打开文档,确保它成为活动文档后,再操作其属性。
- 对象引用:文档打开后,通过
context.application.activeDocument获取当前活动文档的引用,而不是继续使用之前创建的myNewDoc对象。 - 加载属性集合:在添加自定义属性前,必须调用
load()方法加载customProperties集合,否则API无法识别该集合的存在。 - 插件加载范围:如果新文档在独立的Word实例中打开,要确保你的插件会被自动加载到新实例中(大多数全局安装的插件都满足这个条件),否则后续的属性添加操作会失败。
简化的属性设置函数
你可以把属性设置逻辑封装成复用函数,针对活动文档操作:
function setActiveDocumentProperty(propName, propValue) { return Word.run(context => { const activeDoc = context.application.activeDocument; activeDoc.properties.customProperties.load(); return context.sync() .then(() => { activeDoc.properties.customProperties.add(propName, propValue); return context.sync(); }); }).catch(error => { if (error instanceof OfficeExtension.Error) { console.log("Error code and message: " + JSON.stringify(error.debugInfo)); } throw error; }); }
这样在文档打开后,直接调用这个函数即可:
// 在open()后的sync中调用 setActiveDocumentProperty("custom", "prop") .then(() => console.log("属性添加成功")) .catch(err => updateStatus(err.message));
内容的提问来源于stack exchange,提问作者Diego Silvera de Souza
相关产品推荐
相关产品推荐

