找不到名称为'Office'的内容。

10

我正在使用Angular 4与Office.js。该项目是由Angular CLI创建的。

代码很简单:

// declare const Office: any;
// With the line above, the app runs perfect

Office.initialize = function () {
  platformBrowserDynamic().bootstrapModule(AppModule);
};

我遇到了错误

无法找到名称 'Office'。

我已经运行了npm install --save-dev @types/office-js

我的tsconfig.json文件:

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "baseUrl": "src",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2016",
      "dom"
    ]
  }
}

更新 1:

根据 @MahmoodSajjadi 的建议,在执行 npm install --save @microsoft/office-js 后,使用以下代码:

import { Office } from '@microsoft/office-js';

收到以下错误:

ERROR in /my-app/src/main.ts (3,24): 文件 '/my-app/node_modules/@types/office-js/index.d.ts' 不是一个模块。

ERROR in ./src/main.ts 模块未找到: Error: 无法解析 '/my-app/src' 中的 'office-js'

@ ./src/main.ts 3:0-35
@ multi webpack-dev-server/client?http://localhost:4200 ./src/main.ts

在 package.json 中,实际上是 "@microsoft/office-js": "0.0.0",不确定这是否是正确的包。


更新 2:

根据 Michael 的答案,似乎 NPM 版本尚未准备好,我将暂时使用 CDN 版本。感谢大家的帮助!


@type/office-js 包仅是一个类型包而不是实际的 office.js,您需要运行 npm i @microsoft/office-js - Mahmood Sajjadi
@MahmoodSajjadi 嗯,我试过了,现在出现了不同的错误,请看我的问题更新部分。 - Hongbo Miao
1
它不是一个模块,所以你不能从中导入。但是你仍然可以通过 import 'office-js'; 导入它,尽管类型应该会自动捕获而无需这样做。 - Aluan Haddad
此外,您应该在 tsconfig.json 中明确指定您的模块格式。 - Aluan Haddad
@AluanHaddad,我的打字错误,仍然是同样的错误。在package.json中,实际上是"@microsoft/office-js": "0.0.0",不确定它是否是正确的包。 - Hongbo Miao
显示剩余3条评论
4个回答

25

看起来你仍然需要指定使用office-js类型。打开src/tsconfig.app.json文件并将office-js添加到types数组中,如果该数组以前是空的,则现在应该像这样:

"types": ["office-js"]
"types": [
  "office-js"
]

接下来,在尝试重新构建项目之前,您需要在项目目录中运行命令tsc -p tsconfig.json


谢谢您,这个有效!别忘了安装包:npm install @type/office-js - Herz3h

3
以下内容完美运行(请注意包名)
npm install --save office-js @types/office-js

然后按照其声明的全局方式使用它。
Office.initialize(0);

请注意,office-js不是一个模块,它是一个全局变量。因此,我们不能从中导入内容。相反,这个包会自动变成可用的环境。
如果我们想在运行时使用import来加载office-js,我们可以添加:
import 'office-js';

在这种情况下,我们并没有从中导入任何东西,因为没有可导入的内容,但我们声明了对其执行的依赖关系,其副作用是创建全局变量window.Office。
请注意,在您的评论中,您提到了一个@microsoft/office-js包。在撰写本文时,确实存在这样的包,但它完全为空,其入口指定了一个甚至不存在的文件,因此我怀疑这不是您打算使用的包。
另外,请考虑在tsconfig.json文件中明确指定模块格式。
{
  "compilerOptions": {
    "module": "commonjs"
  }
}

这是一个非常重要的设置。


我执行了 npm install --save office-js @types/office-js,但仍然出现相同的错误 Cannot find name 'Office'。我尝试添加 "module": "commonjs",但仍然是同样的情况。 - Hongbo Miao
确保你的TypeScript是最新的(>=2.2.2)。我在一个空项目中尝试了一下,运行良好。 - Aluan Haddad
我需要将以下内容添加到我的tsconfig.js中以使其工作: "typeRoots": [ "node_modules/@types" ] - gkephorus

2

目前,Office.js并不是作为NPM包使用,而是作为CDN引用使用。它的typings/d.ts来自于@types,但不包括它的实际代码。

我建议您看一下Script Lab,这是一个最近发布的工具和开源示例,它使用Angular 4,并且可以用作灵感来源。一些底层技术也在关于该项目的播客中讨论


所以,我很好奇 npm:office-js 包是否已经被弃用了? - Aluan Haddad
1
更准确地说是相反的情况:它尚未完全启动。我们正在考虑将NPM放到我们的CDN上,但这需要一些过程才能实现。而且(至少目前),商店需要CDN引用来绑定任何商店附加组件。如果您有反馈意见,认为您希望通过NPM软件包自己托管文件而不是引用官方CDN,请考虑添加您的理由https://officespdev.uservoice.com/forums/224641/suggestions/573756,以便将其路由到适当的团队。 - Michael Zlatkovsky - Microsoft
非常感谢您的回复,它让情况非常清晰。实际上,我关心我的答案准确性,我不想给出错误的建议,但这是我会给任何试图使用软件包的人的一般建议。话虽如此,如果我要使用这个API,我希望能够直接安装它。 - Aluan Haddad

0

对我来说,创建一个名为“Office”的变量有效。

declare const Office: any;
(async () => {
    await Office.onReady();
    if (!Office.context.requirements.isSetSupported('ExcelApi', '1.7')) {
        console.log("Sorry, this add-in only works with newer versions of Excel.");
    }
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接