保存工作簿的初始状态

Save the initial state of a workbook

我想在开始时保存工作簿(或 Excel 应用程序)的初始状态,这样无论我的加载项对工作簿进行了修改,我都可以随时返回到它.

我在 Home.js 中尝试了以下代码:

(function() {
    "use strict";

    Office.initialize = function(reason) {
        $(document).ready(function() {
            app.initialize();
            initial();
            $('#getInitial').click(getInitial);
        });
    };

    var ctxInitial;

    function initial () {
        ctxInitial = new Excel.RequestContext();
    }

    function getInitial() {
        Excel.run(function () { 
            var wSheetName = 'Sheet1';
            var worksheet = ctxInitial.workbook.worksheets.getItem(wSheetName);
            var usedRange = worksheet.getUsedRange();
            usedRange.load(["values"]);
            return ctxInitial.sync().then(function() {
                document.getElementById("area").value += usedRange.values.toString();
            });
        });
    }
})();

一开始,我的测试很好地打印了工作表的初始值。但是,在对某些单元格值进行一些手动修改后,getInitial 打印工作表的当前状态而不是初始值。

有谁知道实现这一点的最佳实践是什么?

上下文不存储工作簿状态(怎么可能?它是一个 JavaScript 对象,与文档存在于完全不同的世界中)。上下文只是要分派的操作的管道(或者,如果你愿意,也可以是命令的累加器)。

没有真正的理由坚持上下文对象,除了将其用作从同一上下文创建两个对象的方式(例如,range1.getIntersection(range2),因为对象必须来自同一上下文为了互动)。但除此之外,上下文的生命可以(并且通常应该)尽可能快。这就是为什么在 Excel.run 中我们总是为您创建一个新的上下文,并在最后处理它。

在相关说明中,出于相同的推理,执行 Excel.run 并且不使用它提供的上下文(或使用不同的上下文,如您在示例中所做的那样)是没有意义的.您可以在没有 Excel.run 的情况下轻松地 运行 您的代码,如果您要重用现有上下文,那么将它放在 Excel.run 块中对您没有任何好处(请注意,您赢了'获得干净的自动对象跟踪 Excel.run).

希望对您有所帮助!

~ Michael Zlatkovsky,Office 可扩展性团队开发人员,MSFT