在 typescript Excel 加载项中使用网络工作者
Using webworkers in typescript Excel add-in
我有一个加载项(使用 officejs 构建)可以下载、处理大型数据数组并将其放入 Excel。问题是处理时间过长 Excel 会立即终止加载项。我试图将所有工作委托给网络工作者,以便 UI 只执行信使的工作。问题是我不能在 webworker 中调用 Office.initialize (我知道 webworker 有自己的范围等)。我的问题是 - 是否可以从 webworker 调用 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 移至网络工作者而制作的。
您当前的设计不适用。 Excel.run()
必须在调用了 Office.initialize 的上下文中。据我了解,只要输入大小足够小,您就有一个可以使用的版本。您是否可以对输入进行批处理,以便每个批次都使用自己的 Excel.run()
进行处理?然后下一批由调用 Excel.run()
.
的新方法调用处理
我有一个加载项(使用 officejs 构建)可以下载、处理大型数据数组并将其放入 Excel。问题是处理时间过长 Excel 会立即终止加载项。我试图将所有工作委托给网络工作者,以便 UI 只执行信使的工作。问题是我不能在 webworker 中调用 Office.initialize (我知道 webworker 有自己的范围等)。我的问题是 - 是否可以从 webworker 调用 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 移至网络工作者而制作的。
您当前的设计不适用。 Excel.run()
必须在调用了 Office.initialize 的上下文中。据我了解,只要输入大小足够小,您就有一个可以使用的版本。您是否可以对输入进行批处理,以便每个批次都使用自己的 Excel.run()
进行处理?然后下一批由调用 Excel.run()
.