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

Optimization and workarounds for loading and writing large files

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

结束

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

以下是代码片段:

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.xml, Home.html and Home.js。在Home.js中,我尝试通过拆分加载不同的属性来做一些变通,但结果仍然不好。

因此,我在 Excel Online 下针对大型工作簿的不同子集测试了此加载项。测试表明,工作簿越大,功能失败的可能性就越大(尤其是setState需要很多时间并且很可能卡住,即使在Excel Windows) 。这是三个文件:GetNoAllNo.xlsx, GetYesAllNo.xlsxGetYesAllYes.xlsx

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

有人能帮忙吗?

以下link 包含有关 Office 加载项性能优化的宝贵信息:http://dev.office.com/docs/add-ins/develop/resource-limits-and-performance-optimization

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