什么是在任务窗格和Dialog之间共享数据的最佳方式?

时间:2017-05-10 18:21:26

标签: office-js

我正在使用Excel Addin。我们在TaskPane和Dialog中提取了大量数据。因此,这使得Dialog开放速度变慢,因为它是一个单独的浏览器会话,无法利用已经在TaskPane中加载的数据。我想知道在TaskPane和Dialog之间共享会话数据的最佳方式是什么。我可以使用doc settings store。但那些是运行时数据,我真的不想将它们保留在文档中。我尝试使用LocalStorage。它适用于Excel Online和mac,但不适用于Windows。我认为他们在Windows Excel中打开对话框是一个全新的浏览器会话。所以我现在没有想法了。

此外,如果您已经提供了有关如何加快Dialog加载的建议,请告知我们。

2 个答案:

答案 0 :(得分:0)

不确定这是否适合您的需要,但可能将其作为JSON数据传递:

  1. 从任务窗口调用对话框

    var jsonData = encodeURIComponent(JSON.stringify(dataToPassToDialog));
    
    Office.context.ui.displayDialogAsync('https://path/to/dialog.html?' + jsonData, 
        // change these to your preference
        { height: 70, width: 20, cache: false },
    
        function (asyncResult) {
    
            // note _dlg is globally defined
            _dlg = asyncResult.value; 
    
            _dlg.addEventHandler(Office.EventType.DialogMessageReceived, 
            processDialogCallback);
        }
    );
    
  2. 然后在对话框表单上使用此函数从任务窗格中获取JSON数据

    function getJSONFromUrl() {
       var jsonGet = decodeURIComponent(window.location.search.substring(1));
       var jsonGet = jsonGet.substring(0, jsonGet.lastIndexOf("]") + 1);
       return JSON.parse(jsonGet);
    }
    
  3. 最后将数据发送回任务窗口

    Office.context.ui.messageParent(dataFromDialog);

答案 1 :(得分:0)

到目前为止,

sessionStorage对我来说是一个很好的解决方案。

https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage

这使我可以存储一个很大的字符串并从对话框窗口访问它。会话过期时(通常是在关闭浏览器/选项卡且不必处理本地存储时),会话存储数据将被清除。对话窗口似乎为我打开的非常快,因为仅根据需要获取数据,尽管我不确定速度是否仍然对您有问题(几年前有人问并回答了这个问题,从那时起,很多事情都可能发生了变化。

此外,我在Andre的回答上取得了一些成功。它工作得很好且可靠,但前提是我发送的字符串足够短。由于我试图将较大的字符串传递给对话框,因此如果字符串太大(不确定字符串的确切大小,以字节为单位),对话框就会出现问题,实际上该对话框在启动时会脱机而且不会渲染任何东西。

在我看来,在这种情况下依靠浏览器功能似乎很好。话虽如此,我不确定这是否一定是“最佳”方法,并且很想知道是否有更好的方法。