上下文
目前,我正在开发一个使用新的Javascript API for Office的Word加载项。该加载项包含一些基本功能和许多模板。模板与自动打开的任务窗格耦合,用户可在其中配置模板并填写所需信息。在此任务窗格中,用户可以更改标题中的图像。要求用户从一组预定义图像中选择一个图像,然后将其放置在内容控件中。
问题
图像的放置工作正常,但是,每当我尝试设置图像的宽度时,我都会收到GeneralException
。奇怪的是,它在某些情况下确实有效(通常是我调整它的前1到3次)。根据我之前的经验,我知道如果内容控件被锁定,可能会导致GeneralException
。但是,这似乎不是这种情况。我尝试了以下方法,以使其发挥作用。
守则
行'picture.width = 71;
会导致错误。
// Needed to interact with Word in typescript.
declare const Word: any;
export interface IImage {
imageId: string;
base64String: string;
}
export function InsertImageInControl(imageId: string, controlTitle: string) {
Word.run(function(context) {
// Retrieves content control.
var contentControl = context.document.contentControls
.getByTitle(controlTitle)
.getFirst();
// Disable editing protection.
contentControl.cannotEdit = false;
return context
.sync()
.then(function() {
FetchBase64Image(imageId)
.then(function(image) {
let picture = contentControl.insertInlinePictureFromBase64(
image.base64String,
"Replace"
);
// Line that causes the error:
picture.width = 71;
// Reenable editing protection.
contentControl.cannotEdit = true;
})
.then(context.sync)
.catch(function(error) {
console.log(error);
});
})
.catch(function(error) {
console.log(error);
});
});
}
export function FetchBase64Image(imageId: string): Promise<IImage> {
return new Promise<IImage>(function(resolve, reject) {
fetch("api/Images/" + imageId)
.then(function(response) {
resolve(response.json() as Promise<IImage>);
})
.catch(function(error) {
reject(error);
});
});
}
答案 0 :(得分:1)
感谢这个问题。我正在玩这个以及一些评论。
我能够多次获得异常,但只有在我尝试快速设置图像宽度时。我认为它的竞争条件是什么,你试图改变内容控件中只读的宽度。这应该是非常短暂的一段时间(毫秒?),你可以重试该操作,它应该工作。
请试一试!
使用我们的TS库,您可以大大简化代码,并且看起来像这样:
async function changeWidth() {
await Word.run(async (context) => {
//unlock cc
context.document.contentControls.getByTitle("image").getFirst().cannotEdit = false;
await context.sync();
//set image within cc width...
context.document.contentControls.getByTitle("image").getFirst().inlinePictures.getFirst().width = Math.floor((Math.random() * 200) + 50);;
await context.sync();
//lock cc
context.document.contentControls.getByTitle("image").getFirst().cannotEdit = true;
await context.sync();
console.log("success!");
});
}