Инициализация надстройки Office
Надстройки Office часто поддерживают логику запуска для выполнения следующих действий:
Убедитесь, что пользовательская версия Office поддерживает все API Office, которые вызывает ваш код.
Убедитесь в наличии определенных артефактов, таких как лист с определенным именем.
Предложите пользователю выбрать некоторые ячейки в Excel, а затем вставьте диаграмму, инициализированную этими значениями.
Установите привязки.
Используйте API диалогового окна Office, чтобы запрашивать у пользователя значения параметров надстройки по умолчанию.
Однако надстройка Office не может успешно вызывать какие-либо API JavaScript для Office, пока не будет загружена библиотека. В этой статье описываются два способа, с помощью которого код может обеспечить загрузку библиотеки.
- Инициализация с помощью
Office.onReady()
. - Инициализация с помощью
Office.initialize
.
Совет
Рекомендуется использовать Office.onReady()
вместо Office.initialize
. Хотя Office.initialize
по-прежнему поддерживается, Office.onReady()
обеспечивает большую гибкость. Вы можете назначить только один обработчик Office.initialize
, который вызывается инфраструктурой Office только один раз. Вы можете вызывать Office.onReady()
в разных местах кода и использовать разные обратные вызовы.
Сведения о различиях описанных ниже приемов см. в статье Основные различия между Office.initialize и Office.onReady().
Дополнительные сведения о последовательности событий при инициализации надстройки см. в статье Загрузка модели DOM и среды выполнения.
Инициализация с использованием Office.onReady()
Office.onReady()
— это асинхронная функция, которая возвращает объект Promise , проверяя, загружена ли библиотека Office.js. При загрузке библиотеки она разрешает Promise как объект, указывающий клиентское приложение Office со Office.HostType
значением перечисления (Excel
, Word
, и т. д.) и платформу Office.PlatformType
со значением перечисления (PC
, Mac
, OfficeOnline
и т. д.). Объект Promise сопоставляется незамедлительно, если библиотека уже загружена, когда вызывается Office.onReady()
.
Один из способов вызова Office.onReady()
— передать ему функцию обратного вызова. Ниже приведен пример.
Office.onReady(function(info) {
if (info.host === Office.HostType.Excel) {
// Do Excel-specific initialization (for example, make add-in task pane's
// appearance compatible with Excel "green").
}
if (info.platform === Office.PlatformType.PC) {
// Make minor layout changes in the task pane.
}
console.log(`Office.js is now ready in ${info.host} on ${info.platform}`);
});
Кроме того, вы можете привязать метод then()
к вызову Office.onReady()
, вместо того чтобы использовать обратный вызов. Например приведенный ниже код проверяет, поддерживает ли версия Excel пользователя использование API, которые может вызывать надстройка.
Office.onReady()
.then(function() {
if (!Office.context.requirements.isSetSupported('ExcelApi', '1.7')) {
console.log("Sorry, this add-in only works with newer versions of Excel.");
}
});
Ниже приведен тот же пример использования async
ключевых слов и await
в TypeScript.
(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.");
}
})();
Если вы используете дополнительные платформы JavaScript, которые включают собственный обработчик инициализации или тесты, их обычно следует помещать в ответ на Office.onReady()
. Например, на метод JQuery$(document).ready()
можно ссылаться следующим образом:
Office.onReady(function() {
// Office is ready.
$(document).ready(function () {
// The document is ready.
});
});
Однако существуют исключения для таких случаев. Например, предположим, что вы хотите открыть надстройку в браузере (а не загружать ее в приложение Office), чтобы отладить пользовательский интерфейс с помощью средств браузера. В этом сценарии, когда Office.js определит, что оно выполняется за пределами ведущего приложения Office, он вызовет обратный вызов и выполнит обещание null
как для узла, так и для платформы.
Другим исключением может быть, если вы хотите, чтобы индикатор хода выполнения отображался в области задач во время загрузки надстройки. В этом сценарии код должен вызвать jQuery ready
и использовать его обратный вызов для отображения индикатора хода выполнения. Затем обратный Office.onReady
вызов может заменить индикатор хода выполнения конечным пользовательским интерфейсом.
Инициализация с использованием Office.initialize
Событие инициализации запускается, когда библиотека Office.js будет загружена и готова к взаимодействию с пользователем. Вы можете назначить обработчик Office.initialize
для реализации вашей логики инициализации. Например, приведенный ниже код проверяет, поддерживает ли версия Excel пользователя использование API, которые может вызывать надстройка.
Office.initialize = function () {
if (!Office.context.requirements.isSetSupported('ExcelApi', '1.7')) {
console.log("Sorry, this add-in only works with newer versions of Excel.");
}
};
Если вы используете дополнительные платформы JavaScript, которые включают собственный обработчик инициализации или тесты, их обычно следует помещать в Office.initialize
событие (исключения, описанные в разделе Initialize with Office.onReady() выше, также применимы в этом случае). Например, на метод JQuery$(document).ready()
можно ссылаться следующим образом:
Office.initialize = function () {
// Office is ready.
$(document).ready(function () {
// The document is ready.
});
};
Для надстроек области задач и контентных надстроек Office.initialize
предоставляет дополнительный параметр reason. Этот параметр определяет порядок добавления надстройки в текущий документ. Это поможет обеспечить разную логику в тех случаях, когда надстройка вставляется впервые или когда она уже существует в документе.
Office.initialize = function (reason) {
$(document).ready(function () {
switch (reason) {
case 'inserted': console.log('The add-in was just inserted.');
case 'documentOpened': console.log('The add-in is already part of the document.');
}
});
};
Дополнительные сведения см. в статьях Событие Office.initialize и Перечисление InitializationReason.
Основные различия между Office.initialize и Office.onReady
Вы можете назначить только один обработчик для
Office.initialize
, который будет вызываться только один раз инфраструктурой Office, но вы можете вызыватьOffice.onReady()
в разных местах вашего кода и использовать разные обратные вызовы. Например, ваш код может вызватьOffice.onReady()
сразу после загрузки настраиваемого скрипта с обратным вызовом, запускающим логику инициализации. В коде также может применяться кнопка в области задач, чей скрипт вызываетOffice.onReady()
с другим обратным вызовом. В этом случае второй обратный вызов запускается при нажатии кнопки.Событие
Office.initialize
запускается в конце выполнения внутренних процессов, когда Office.js инициализирует собственное выполнение. И оно срабатывает сразу же после окончания внутренних процессов. Если код, в котором вы назначаете обработчик события, выполняется слишком долго после запуска события, тогда обработчик не запускается. Например если вы используете диспетчер задач WebPack, он может настроить домашнюю страницу надстройки для загрузки файлов полизаполнения сразу после загрузки Office.js, но перед загрузкой вашего настраиваемого скрипта JavaScript. К тому моменту, когда ваш скрипт загружается и назначает обработчика, инициализации события уже выполнена. Но никогда не "слишком поздно" вызыватьOffice.onReady()
. Если инициализация события уже произошла, обратный вызов выполняется немедленно.
Примечание.
Даже если отсутствует логика запуска, следует вызвать Office.onReady()
или назначить пустую функцию для Office.initialize
, когда ваша надстройка загружает JavaScript. Некоторые сочетания приложений и платформ Office не загружаются в область задач, пока не произойдет одно из них. Эти два способа показаны в приведенных ниже примерах.
Office.onReady();
Office.initialize = function () {};
Инициализация отладки
Сведения об отладке функций и Office.onReady()
см. в Office.initialize
разделе Отладка функций initialize и onReady.
См. также
Office Add-ins