设置InlinePicture宽度时的常规异常

时间:2018-04-12 08:45:47

标签: typescript ms-word office-js

上下文

目前,我正在开发一个使用新的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);
      });
  });
}

1 个答案:

答案 0 :(得分:1)

感谢这个问题。我正在玩这个以及一些评论。

  1. 不确定您是否知道这一点,但我们也为Office.js提供了一个TypeScript库,而无需创建自己的。
  2. 我创建了一个基本上复制代码的示例。您可以使用Script Lab来尝试我的代码段。请import this yaml在那里运行代码。 重要:确保在标题中添加内容控件并使用“image”标题进行复制。然后单击插入图片按钮,然后单击更改宽度按钮多次。
  3. 我能够多次获得异常,但只有在我尝试快速设置图像宽度时。我认为它的竞争条件是什么,你试图改变内容控件中只读的宽度。这应该是非常短暂的一段时间(毫秒?),你可以重试该操作,它应该工作。

    请试一试!

    使用我们的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!");
        });
    }