加载和编写大文件的优化和解决方法

时间:2016-06-28 13:04:00

标签: ms-office office-js

我想实现两个函数:getState将工作簿的初始值和公式保存到JavaScript变量,setState从JavaScript变量恢复工作簿的初始公式和值。通常,我的加载项从执行getState开始,然后执行一些可能更改范围公式和值的操作,并以执行setState结束。

但是,我意识到这些函数可能会引发大型Excel文件的内部错误(其中一个工作表可能包含数千行)。例如,

enter image description here

以下是代码段:

var usedRanges;

function getState () {
    return Excel.run(function (ctx) {
        usedRanges = [];
        var worksheets = ctx.workbook.worksheets;
        var usedRangesLocal = [];
        worksheets.load('items');
        return ctx.sync()
            .then(function () {
                for (var i = 0; i < worksheets.items.length; i++) { 
                    worksheets.items[i].load('name');
                    usedRangesLocal[i] = worksheets.items[i].getUsedRange();
                    usedRangesLocal[i].load(["address", "formulasR1C1", "values"]);
                }
            })
            .then(ctx.sync)
            .then(function () {
                for (var i = 0; i < worksheets.items.length; i++) {
                    usedRanges.push({
                        sheet: worksheets.items[i].name,
                        address: usedRangesLocal[i].address,
                        formulasR1C1: usedRangesLocal[i].formulasR1C1,
                        values: usedRangesLocal[i].values
                    });
                }
            });
    });
}

function setState () {
    return Excel.run(function (ctx) {
        var worksheets = ctx.workbook.worksheets;
        worksheets.load('items');
        return ctx.sync()
            .then(function () {
                for (var i = 0; i < worksheets.items.length; i++) {
                    var r = worksheets.items[i].getRange(usedRanges[i].address);
                    r.values = usedRanges[i].values
                    r.formulasR1C1 = usedRanges[i].formulasR1C1; 
                }
            });
    });
}

这些是Manifest_remote.xmlHome.htmlHome.js。在Home.js中,我尝试通过拆分不同属性的加载来做一些变通方法,但结果仍然不好。

所以我在Excel Online下针对大型工作簿的不同子集测试此加载项。测试显示,工作簿越大,功能失败的可能性越大(特别是setState需要花费大量时间,并且很可能会卡住,即使在Excel Windows下)。以下是三个文件:GetNoAllNo.xlsxGetYesAllNo.xlsxGetYesAllYes.xlsx

这些xlsx文件是现实的,不是很大。所以我真的在寻找解决方案或解决方法,以使getStatesetState更好地工作。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

以下链接提供了有关Office加载项性能优化的重要信息:http://dev.office.com/docs/add-ins/develop/resource-limits-and-performance-optimization

设计和实施技术部分的信息将有助于解决此问题。