Надстройки PowerPoint

С помощью надстроек PowerPoint можно создавать удобные решения, подходящие для использования в презентациях на различных платформах, таких как Windows, iPad, Mac и браузеры. Можно создать два типа надстроек PowerPoint:

  • Контентные надстройки позволяют добавлять динамический контент HTML5 в презентации. Например, ознакомьтесь с надстройкой LucidChart Diagrams for PowerPoint, с помощью которой можно добавить интерактивные схемы LucidChart в набор слайдов.

  • Надстройки области задач позволяют добавлять справочные сведения или данные в презентацию с помощью службы. Например, используя надстройку Pexels - Free Stock Photos, вы можете вставить профессиональные фотографии в свою презентацию.

Сценарии надстроек PowerPoint

В приведенных в этой статье примерах кода показаны основные задачи по разработке надстроек для PowerPoint. Обратите внимание на следующее:

  • При отображении сведений эти примеры используют функцию app.showNotification, включенную в шаблоны проектов надстроек Office в Visual Studio. Если для разработки надстройки вы не используете Visual Studio, замените функцию showNotification собственным кодом.

  • В некоторых из этих примеров также используется объект, объявленный Globals за пределами область этих функций, как:var Globals = {activeViewHandler:0, firstSlideId:0};

  • Для использования этих примеров необходимо, чтобы проект надстройки ссылался на библиотеку Office.js 1.1 или более поздней версии.

Определение активного представления презентации и обработка события ActiveViewChanged

При создании контентной надстройки вам понадобится получить активное представление презентации, а также обработать событие ActiveViewChanged в рамках обработчика событий Office.Initialize.

Примечание.

В PowerPoint в Интернете не удастся запустить событие Document.ActiveViewChanged, поскольку режим показа слайдов обрабатывается как новый сеанс. В этом случае надстройке необходимо получить активное представление по загрузке, как показано в примере кода ниже.

В представленном ниже примере кода:

  • Функция getActiveFileView вызывает метод Document.getActiveViewAsync , чтобы определить, является ли текущее представление презентации "edit" (любое из представлений, в которых можно редактировать слайды, например "Обычный " или "Режим структуры") или "Чтение" (слайд-шоу или режим чтения).

  • Функция registerActiveViewChanged вызывает метод addHandlerAsync для регистрации обработчика для события Document.ActiveViewChanged .

//general Office.initialize function. Fires on load of the add-in.
Office.initialize = function(){

    //Gets whether the current view is edit or read.
    const currentView = getActiveFileView();

    //register for the active view changed handler
    registerActiveViewChanged();

    //render the content based off of the currentView
    //....
}

function getActiveFileView()
{
    Office.context.document.getActiveViewAsync(function (asyncResult) {
        if (asyncResult.status == "failed") {
            app.showNotification("Action failed with error: " + asyncResult.error.message);
        }
        else {
            app.showNotification(asyncResult.value);
        }
    });

}

function registerActiveViewChanged() {
    Globals.activeViewHandler = function (args) {
        app.showNotification(JSON.stringify(args));
    }

    Office.context.document.addHandlerAsync(Office.EventType.ActiveViewChanged, Globals.activeViewHandler,
        function (asyncResult) {
            if (asyncResult.status == "failed") {
                app.showNotification("Action failed with error: " + asyncResult.error.message);
            }
            else {
                app.showNotification(asyncResult.status);
            }
        });
}

В следующем примере кода функция getSelectedRange вызывает метод Document.getSelectedDataAsync для получения объекта JSON, возвращаемого свойством asyncResult.value. Этот объект содержит массив с именем slides. Массив slides содержит идентификаторы, заголовки и индексы выбранного диапазона слайдов (или текущего слайда, если не выбрано несколько слайдов). Кроме того, он сохраняет идентификатор первого слайда в выбранном диапазоне в глобальной переменной.

function getSelectedRange() {
    // Get the id, title, and index of the current slide (or selected slides) and store the first slide id */
    Globals.firstSlideId = 0;

    Office.context.document.getSelectedDataAsync(Office.CoercionType.SlideRange, function (asyncResult) {
        if (asyncResult.status == "failed") {
            app.showNotification("Action failed with error: " + asyncResult.error.message);
        }
        else {
            Globals.firstSlideId = asyncResult.value.slides[0].id;
            app.showNotification(JSON.stringify(asyncResult.value));
        }
    });
}

В приведенном ниже примере кода функция goToFirstSlide вызывает метод Document.goToByIdAsync для перехода к первому слайду, который был определен показанной ранее функцией getSelectedRange.

function goToFirstSlide() {
    Office.context.document.goToByIdAsync(Globals.firstSlideId, Office.GoToType.Slide, function (asyncResult) {
        if (asyncResult.status == "failed") {
            app.showNotification("Action failed with error: " + asyncResult.error.message);
        }
        else {
            app.showNotification("Navigation successful");
        }
    });
}

В следующем примере кода функция goToSlideByIndex вызывает метод Document.goToByIdAsync для перехода к следующему слайду презентации.

function goToSlideByIndex() {
    const goToFirst = Office.Index.First;
    const goToLast = Office.Index.Last;
    const goToPrevious = Office.Index.Previous;
    const goToNext = Office.Index.Next;

    Office.context.document.goToByIdAsync(goToNext, Office.GoToType.Index, function (asyncResult) {
        if (asyncResult.status == "failed") {
            app.showNotification("Action failed with error: " + asyncResult.error.message);
        }
        else {
            app.showNotification("Navigation successful");
        }
    });
}

Получение URL-адреса презентации

В следующем примере кода функция вызывает метод Document.getFileProperties, getFileUrl чтобы получить URL-адрес файла презентации.

function getFileUrl() {
    //Get the URL of the current file.
    Office.context.document.getFilePropertiesAsync(function (asyncResult) {
        const fileUrl = asyncResult.value.url;
        if (fileUrl == "") {
            app.showNotification("The file hasn't been saved yet. Save the file and try again");
        }
        else {
            app.showNotification(fileUrl);
        }
    });
}

Создание презентации

Ваша надстройка может создать новую презентацию, отдельную от экземпляра PowerPoint, в котором в настоящее время работает надстройка. Для этой цели в пространстве имен PowerPoint есть метод createPresentation. При вызове этого метода сразу открывается и отображается новая презентация в новом экземпляре программы PowerPoint. Ваша надстройка остается открытой и запущенной в предыдущей презентации.

PowerPoint.createPresentation();

С помощью метода createPresentation также можно создать копию существующей презентации. Метод принимает в качестве необязательного параметра строковое представление PPTX-файла в кодировке base64. Полученная презентация будет копией этого файла, предполагая, что строковый аргумент является допустимым PPTX-файлом. Преобразование файла в нужную строку в кодировке base64 можно выполнить с помощью класса FileReader, как показано в приведенном ниже примере.

const myFile = document.getElementById("file");
const reader = new FileReader();

reader.onload = function (event) {
    // strip off the metadata before the base64-encoded string
    const startIndex = reader.result.toString().indexOf("base64,");
    const copyBase64 = reader.result.toString().substr(startIndex + 7);

    PowerPoint.createPresentation(copyBase64);
};

// read in the file as a data URL so we can parse the base64-encoded string
reader.readAsDataURL(myFile.files[0]);

См. также