Использование веб-работников в машинописной надстройке Excel - PullRequest
0 голосов
/ 06 июня 2018

У меня есть надстройка (встроенная в officejs), которая загружает, обрабатывает и помещает большие массивы данных в Excel.Проблема в том, что обработка занимает слишком много времени, Excel немедленно убивает надстройку.Я попытался передать всю работу веб-работнику, чтобы пользовательский интерфейс выполнял только работу мессенджера.Проблема в том, что я не могу вызвать Office.initialize у веб-работника (я понимаю, что у веб-работника есть своя область и т. Д.)У меня вопрос - возможно ли совершать звонки в Excel от веб-работника, и если да, то как их правильно сделать?

Редактировать: Вот пример источника:

app.js

function createTableWorker() {
    if (typeof(worker) == "undefined"){
        console.log("creating new worker!");
        worker = new Worker("test_worker.js");
    }

    worker.onmessage = function(event) {
        console.log("From worker: " + event.data);
    };

    worker.postMessage("message");
}

worker.js

this.onmessage = function(e) {
    console.log("Worker On Message!");
    importScripts("https://appsforoffice.microsoft.com/lib/beta/hosted/office.debug.js");
    doExcelWork();
}

function doExcelWork() {
    Excel.run(function (context) {
        debugger;
        const currentWorksheet = context.workbook.worksheets.getActiveWorksheet();
        const expensesTable = currentWorksheet.tables.add("A1:D1", true /*hasHeaders*/);
        expensesTable.name = "ExpensesTable";

        expensesTable.getHeaderRowRange().values = 
        [["Date", "Merchant", "Category", "Amount"]];

        expensesTable.rows.add(null /*add at the end*/, [
        ["1/1/2017", "The Phone Company", "Communications", "120"],
        ["1/2/2017", "Northwind Electric Cars", "Transportation", "142.33"],
        ["1/5/2017", "Best For You Organics Company", "Groceries", "27.9"],
        ["1/10/2017", "Coho Vineyard", "Restaurant", "33"],
        ["1/11/2017", "Bellows College", "Education", "350.1"],
        ["1/15/2017", "Trey Research", "Other", "135"],
        ["1/15/2017", "Best For You Organics Company", "Groceries", "97.88"]
        ]);

        expensesTable.columns.getItemAt(3).getRange().numberFormat = [['€#,##0.00']];
        expensesTable.getRange().format.autofitColumns();
        expensesTable.getRange().format.autofitRows();

        return context.sync();
    })
    .catch(function (error) {
        console.log("Error: " + error);
        if (error instanceof OfficeExtension.Error) {
            console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
    });

    postMessage("Hello World Msg!");
}

Пример был сделан следующим образом https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/excel-tutorial и перемещением Excel.run к веб-работнику.

1 Ответ

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

Ваш текущий дизайн не будет работать.Excel.run() должно быть в контексте, где был вызван Office.initialize.Насколько я понимаю, у вас была версия, которая работала при условии, что размер ввода был достаточно мал.Возможно ли для вас пакетный ввод, чтобы каждый пакет обрабатывался со своим собственным Excel.run()?И затем следующий пакет обрабатывается новым вызовом метода, который вызывает Excel.run().

...