MS Office надстройка Word на основе JS с Angular 6 - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в надстройках Office для JS и пытаюсь создать пример надстройки Word с помощью Angular 6 + Typescript.

С этой целью я нашел набор инструментов для офиса, который выглядит как идеальный.начало: https://www.npmjs.com/package/office-toolbox. Тем не менее, его шаблоны относятся к Angular 1.x.Итак, я попытался поэкспериментировать, объединив новый проект CLI Angular 6 с шаблоном из набора инструментов, но безуспешно.

Я попробовал два подхода.Конечно, оба требуют сначала установить набор инструментов Office глобально:

  npm install -g office-toolbox

Как только надстройка запущена, я понимаю, что мы должны сначала скопировать XML-манифест и открыть его в Word, то есть:

  1. скопировать XML-манифест из вашего проекта в общий ресурс, который вы создали для этой цели (например, C:\Sideloads);
  2. запустить надстройку (npm start или ng serve);
  3. откройте новый документ Word;
  4. откройте ленту Developer и нажмите Add-ins;
  5. , перейдите Shared folder, выберите дополнение и нажмите Add.На ленте появляется новая кнопка: щелкните ее, чтобы отобразить ее панель.

Проблема заключается в том, что отсутствует современное решение для использования Angular 6 с надстройками Office, ипонимание процесса начальной загрузки в этой среде не так тривиально.Таким образом, я попробовал с 2 хакерскими подходами, но ни один не работал.Кто-нибудь может предложить лучший способ?Вот подходы:

Подход 1

Это следует инструкциям с сайта набора инструментов для офиса.

  1. Запустите office-toolbox generate и ответьте на вопросы:создайте новое приложение с его манифестом на основе Angular.

  2. Теперь я хотел бы попробовать обновить проект.Я попытался изменить package.json, объединив его с пакетом по умолчанию ng new, и затем запустил npm install.Пакет, сгенерированный инструментарием, выглядит следующим образом:

    {
      "name": "sample-add-in",
      "description": "",
      "author": "",
      "version": "0.1.0",
      "scripts": {
        "tsc": "tsc -p tsconfig.json -w",
        "server": "browser-sync start --config bsconfig.json",
        "copy": "cpx \"src/**/!(*.ts)\" dist --watch",
        "start": "rimraf dist && concurrently \"npm run tsc\" \"npm run copy\" \"npm run server\"",
        "validate": "./node_modules/.bin/validate-office-addin"
      },
      "dependencies": {
        "core-js": "^2.4.1",
        "office-ui-fabric-js": "^1.3.0",
        "jquery": "^3.1.1",
        "angular": "^1.6.1",
        "office-addin-validator": "^1.0.1"
      },
      "devDependencies": {
        "concurrently": "^3.1.0",
        "cpx": "^1.5.0",
        "rimraf": "^2.5.4",
        "browser-sync": "^2.18.5",
        "typescript": "^2.1.4",
        "@types/office-js": "^0.0.37",
        "@types/jquery": "^2.0.39",
        "@types/angular": "^1.6.2"
      }
    }

Объединенный файл:

{
  "name": "sample-add-in",
  "description": "",
  "author": "",
  "version": "0.1.0",
  "scripts": {
    "tsc": "tsc -p tsconfig.json -w",
    "server": "browser-sync start --config bsconfig.json",
    "copy": "cpx \"src/**/!(*.ts)\" dist --watch",
    "start": "rimraf dist && concurrently \"npm run tsc\" \"npm run copy\" \"npm run server\"",
    "validate": "./node_modules/.bin/validate-office-addin",

      "ng": "ng",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "dependencies": {
    "@angular/animations": "^6.0.0",
    "@angular/common": "^6.0.0",
    "@angular/compiler": "^6.0.0",
    "@angular/core": "^6.0.0",
    "@angular/forms": "^6.0.0",
    "@angular/http": "^6.0.0",
    "@angular/platform-browser": "^6.0.0",
    "@angular/platform-browser-dynamic": "^6.0.0",
    "@angular/router": "^6.0.0",
    "core-js": "^2.5.4",
    "rxjs": "^6.0.0",
    "zone.js": "^0.8.26",

      "office-ui-fabric-js": "^1.3.0",
    "jquery": "^3.1.1",
    "office-addin-validator": "^1.0.1"
  },
  "devDependencies": {
    "@angular/compiler-cli": "^6.0.0",
    "@angular-devkit/build-angular": "~0.6.0",
    "typescript": "~2.7.2",
    "@angular/cli": "~6.0.0",
    "@angular/language-service": "^6.0.0",
    "@types/jasmine": "~2.8.6",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "codelyzer": "~4.2.1",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~1.7.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~1.4.2",
    "karma-jasmine": "~1.1.1",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.3.0",
    "ts-node": "~5.0.1",
    "tslint": "~5.9.1",

      "concurrently": "^3.1.0",
    "cpx": "^1.5.0",
    "rimraf": "^2.5.4",
    "browser-sync": "^2.18.5",
    "@types/office-js": "^0.0.37",
    "@types/jquery": "^2.0.39",
    "@types/angular": "^1.6.2"
  }
}

Тем не менее, когда я запускаю npm start, я получаю этиошибки с главной страницы:

Refused to apply style from 'https://localhost:3000/node_modules/angular/angular-csp.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.

angular.js:1 Failed to load resource: the server responded with a status of 404 (Not Found)

Refused to execute script from 'https://localhost:3000/node_modules/angular/angular.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

app.ts:9 Uncaught ReferenceError: angular is not defined
    at app.ts:9
    at app.ts:43

o15apptofilemappingtable.debug.js:5530 Warning: Office.js is loaded outside of Office client
telemetryproxy.html:1 Failed to load resource: the server responded with a status of 404 ()
(index):1 Refused to apply style from 'https://localhost:3000/node_modules/angular/angular-csp.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.

telemetryproxy.html:1 Failed to load resource: the server responded with a status of 404 ()

Подход 2

Таким образом, я попробовал обратный подход, который, как представляется, предлагается на https://github.com/Hongbo-Miao/office-addin-quick-start (мне пришлось что-то изменить).

  1. создайте новое угловое приложение: ng new sample-addin

  2. войдите в его каталог и запустите набор инструментов office: office-toolbox.Создайте манифест (создайте подпапку: НЕТ, создайте новый плагин: НЕТ).Это перезапишет некоторые файлы, поэтому перед продолжением сделайте копию тех, которые требуют слияния:

    • package.json: скопируйте перед перезаписью.
    • tsconfig.json: не перезаписывайте,он идентичен.
    • index.html: просто перезаписать.
  3. в index.html, добавить перед закрывающим тегом head:

  4. в main.ts заменить это:

    platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.log(err));

на:

    declare const Office: any;

    Office.initialize = () => {
    platformBrowserDynamic().bootstrapModule(AppModule)
        .catch(err => console.log(err));
    };
объединяет отсутствующий контент из сохраненной копии package.json, заменяя старые пакеты Angular и ссылки на Typescript и добавляя все отсутствующие пакеты, связанные с Angular.Образец:
    {
      "name": "sample-add-in",
      "description": "",
      "author": "",
      "version": "0.1.0",
      "scripts": {
        "tsc": "tsc -p tsconfig.json -w",
        "server": "browser-sync start --config bsconfig.json",
        "copy": "cpx \"src/**/!(*.ts)\" dist --watch",
        "start": "rimraf dist && concurrently \"npm run tsc\" \"npm run copy\" \"npm run server\"",
        "validate": "./node_modules/.bin/validate-office-addin",

          "ng": "ng",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
      },
      "dependencies": {
        "@angular/animations": "^6.0.0",
        "@angular/common": "^6.0.0",
        "@angular/compiler": "^6.0.0",
        "@angular/core": "^6.0.0",
        "@angular/forms": "^6.0.0",
        "@angular/http": "^6.0.0",
        "@angular/platform-browser": "^6.0.0",
        "@angular/platform-browser-dynamic": "^6.0.0",
        "@angular/router": "^6.0.0",
        "core-js": "^2.5.4",
        "rxjs": "^6.0.0",
        "zone.js": "^0.8.26",

          "jquery": "^3.1.1",
        "office-addin-validator": "^1.0.1",
        "office-ui-fabric-js": "^1.5.0"
      },
      "devDependencies": {
        "@angular/compiler-cli": "^6.0.0",
        "@angular-devkit/build-angular": "~0.6.0",
        "typescript": "~2.7.2",
        "@angular/cli": "~6.0.0",
        "@angular/language-service": "^6.0.0",
        "@types/jasmine": "~2.8.6",
        "@types/jasminewd2": "~2.0.3",
        "@types/node": "~8.9.4",
        "codelyzer": "~4.2.1",
        "jasmine-core": "~2.99.1",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~1.7.1",
        "karma-chrome-launcher": "~2.2.0",
        "karma-coverage-istanbul-reporter": "~1.4.2",
        "karma-jasmine": "~1.1.1",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "~5.3.0",
        "ts-node": "~5.0.1",
        "tslint": "~5.9.1",

          "concurrently": "^3.1.0",
        "cpx": "^1.5.0",
        "rimraf": "^2.5.4",
        "browser-sync": "^2.18.5",
        "@types/office-js": "^0.0.37",
        "@types/jquery": "^2.0.39",
        "@types/angular": "^1.6.2"
      }
    }
если вы используете Windows, поскольку платформа надстроек использует Internet Explorer, раскомментируйте эти строки в polyfills.ts:
    import 'core-js/es6/symbol';
    import 'core-js/es6/object';
    import 'core-js/es6/function';
    import 'core-js/es6/parse-int';
    import 'core-js/es6/parse-float';
    import 'core-js/es6/number';
    import 'core-js/es6/math';
    import 'core-js/es6/string';
    import 'core-js/es6/date';
    import 'core-js/es6/array';
    import 'core-js/es6/regexp';
    import 'core-js/es6/map';
    import 'core-js/es6/weak-map';
    import 'core-js/es6/set';

Это также не сработает при загрузке с похожими ошибками.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Наконец-то я получил пример надстройки в Word, здесь я публикую полную процедуру из https://docs.microsoft.com/en-us/office/dev/add-ins/excel/excel-add-ins-get-started-angular с некоторыми исправлениями и интеграциями.Когда надстройка запускается в браузере, ничего не отображается, и это может вводить в заблуждение.Когда вместо этого он запускается внутри узла Office, появляется стандартный компонент приложения с угловым логотипом и URL-адресами.Так что могут возникнуть проблемы с отладкой, но я могу добавить следующую ссылку: https://docs.microsoft.com/en-us/office/dev/add-ins/testing/attach-debugger-from-task-pane.

Другие ссылки:

Настройка

Создайте общую папку для размещения ваших плагинов локально, например C:\Sideloads.Здесь вы будете копировать XML-манифест для каждого дополнения:

1.open Computer Management;2.гото Shared Folders/Shares;3. добавьте папку, например, Sideloads, указывающую на C:\Sideloads.

После того, как вы создали и запустили надстройку и добавили ее сертификат в качестве доверенного, убедитесь, что вы скопировали его XML-манифест в общий ресурс боковых загрузок,и откройте его в Word:

  1. скопируйте XML-манифест из вашего проекта в свою папку (например, C:\Sideloads);
  2. запустите надстройку (npm run start или ng serve);
  3. открыть новый документ Word;
  4. открыть ленту Developer и щелкнуть Add-ins;
  5. перейти к Shared folder, выбрать дополнение и нажать Add.На ленте появляется новая кнопка: щелкните ее, чтобы отобразить ее панель.

Надстройка

Создайтенадстройка:

  1. убедитесь, что вы установили генератор Yeoman для надстроек Office в глобальном масштабе (npm install -g yo generator-office).
  2. создайте приложение Angular CLI как обычно (ng new my-addin).
  3. перейдите в папку вашего приложения (my-addin) и запустите генератор: yo office: создать подпапку для проекта: Нет, создать новую надстройку: № Примечание : если вы 'появится запрос на перезапись package.json, ответьте «Нет» (не перезаписывать).

Защитите надстройку с помощью HTTPS.Надстройки, не защищенные SSL (HTTPS), генерируют небезопасные предупреждения о содержании и ошибки во время использования.Если вы планируете запустить надстройку в Office Online или опубликовать надстройку в AppSource, она должна быть защищена SSL.Если ваша надстройка получает доступ к внешним данным и службам, она должна быть защищена SSL для защиты передаваемых данных.Самозаверяющие сертификаты могут использоваться для разработки и тестирования, если сертификат является доверенным на локальном компьютере.

Для этого быстрого запуска вы можете использовать сертификаты, которые предоставляет генератор Yeoman для надстроек Office,Вы уже установили генератор в глобальном масштабе, поэтому вам просто нужно скопировать сертификаты из глобальной папки установки в папку вашего приложения.

  1. выполните следующую команду, чтобы определить папку, в которой находятся глобальные библиотеки npm.установлены: npm list -g.Первая строка вывода, сгенерированного этой командой, указывает папку, в которой установлены глобальные библиотеки npm.В Windows 10 я обнаружил его под C:\Users\USERNAME\AppData\Roaming\npm\node_modules\generator-office\generators\app\templates\js\base.
  2. из этого места, скопируйте папку certs в корневую папку приложения надстройки.
  3. package.json: изменитьсценарий запуска, указывающий, что сервер должен работать с использованием SSL и порта 3000:
    "start": "ng serve --ssl true --port 3000"
angular.json: измените объект serve, указав расположение файлов сертификата:
    "serve": {
        "builder": "@angular-devkit/build-angular:dev-server",
        "options": {
            "browserTarget": "app:build",
            "ssl": true,
            "sslKey": "certs/server.key",
            "sslCert": "certs/server.crt"
        },
index.html: добавить следующий тег script непосредственно перед закрывающим тегом head:
    <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
main.ts: заменить platformBrowserDynamic().bootstrapModule(AppModule).catch(err => console.log(err)); на следующий код:
    declare const Office: any;

    Office.initialize = () => {
    platformBrowserDynamic().bootstrapModule(AppModule)
        .catch(err => console.log(err));
    };    
polyfills.ts: добавьте следующую строку кода над всеми другими существующими операторами импорта и раскомментируйте импорт IE, указанный ниже:
    import 'core-js/client/shim';

Импорт IE должен быть раскомментирован:

    import 'core-js/es6/symbol';
    import 'core-js/es6/object';
    import 'core-js/es6/function';
    import 'core-js/es6/parse-int';
    import 'core-js/es6/parse-float';
    import 'core-js/es6/number';
    import 'core-js/es6/math';
    import 'core-js/es6/string';
    import 'core-js/es6/date';
    import 'core-js/es6/array';
    import 'core-js/es6/regexp';
    import 'core-js/es6/map';
    import 'core-js/es6/weak-map';
    import 'core-js/es6/set';

Измените app.component, как требуется для вашего приложения.

Когда все будет готово, запустите сервер с npm run start и перейдите к http://localhost:3000. Если ваш браузер показывает, что сертификат сайта не является доверенным, вам нужно будет добавить сертификат в качестве доверенного сертификата: https://github.com/OfficeDev/generator-office/blob/master/src/docs/ssl.md. Обратите внимание, что Chrome может продолжать указывать, что сертификат сайта не является доверенным, даже после того, как вы завершили процесс;Вы можете игнорировать это.

0 голосов
/ 07 июня 2018

Я думаю, что подход 2 или его разновидность - ваша лучшая стратегия.

Ошибка «Office.js загружается вне клиента Office» - это то, что вы получаете, открывая домашнюю страницу надстройки.страницы в браузере вместо открытия в Word при нажатии кнопки ленты.Это ожидается и по замыслу.npm start вызывает автоматическое открытие надстройки в браузере?Если это так, просто закройте окно браузера.У вас возникают проблемы при запуске надстройки нажатием на кнопку ленты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...