Office js 什么';在任务窗格和对话框中共享数据的最佳方式是什么?

Office js 什么';在任务窗格和对话框中共享数据的最佳方式是什么?,office-js,Office Js,我正在开发一个Excel插件。我们在任务窗格和对话框中获取了大量数据。因此,这会使对话框打开变慢,因为它是一个单独的浏览器会话,无法利用任务窗格中已加载的数据。我想知道在TaskPane和Dialog之间共享会话数据的最佳方式是什么。我可以使用文档设置存储。但这些都是运行时数据,我不想将它们保存在文档中。我尝试使用本地存储。它可以在Excel Online和mac上运行,但不能在Windows上运行。我认为在Windows Excel中打开对话框是一个全新的浏览器会话。所以我现在没有主意了 此外

我正在开发一个Excel插件。我们在任务窗格和对话框中获取了大量数据。因此,这会使对话框打开变慢,因为它是一个单独的浏览器会话,无法利用任务窗格中已加载的数据。我想知道在TaskPane和Dialog之间共享会话数据的最佳方式是什么。我可以使用文档设置存储。但这些都是运行时数据,我不想将它们保存在文档中。我尝试使用本地存储。它可以在Excel Online和mac上运行,但不能在Windows上运行。我认为在Windows Excel中打开对话框是一个全新的浏览器会话。所以我现在没有主意了


此外,如果您对如何加快对话框加载有任何建议,请告诉我。

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

  • 从任务窗格调用对话框

    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);
        }
    );
    
  • 然后在对话框窗体上使用此函数从任务窗格获取JSON数据

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

    function getJSONFromUrl() {
       var jsonGet = decodeURIComponent(window.location.search.substring(1));
       var jsonGet = jsonGet.substring(0, jsonGet.lastIndexOf("]") + 1);
       return JSON.parse(jsonGet);
    }
    
    Office.context.ui.messageParent(dataFromDialog)


  • 到目前为止,会话存储对我来说是一个很好的解决方案

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

    而且,我对安德烈的回答也有一些成功。它工作得很好,也很可靠,但前提是我发送的字符串足够短。因为我试图将一个相当大的字符串传递给对话框,所以如果字符串太大(不确定字符串的确切大小,以字节为单位),对话框在启动时实际上会说它是脱机的,并且不会呈现任何内容,我会遇到问题


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

    当你说“Dialog”时,我们说的是dialogapi,对吗?请给出一个更具体的代码示例,说明您在任务窗格和对话框中放置了什么?本地存储是在任务窗格和对话框之间共享数据的最佳方式。除了Michael Z的问题,当你说它在Windows上不工作时,你是什么意思?症状是什么?顺便说一句,该对话框实际上是一个新的浏览器会话(在所有主机中,而不仅仅是Excel)。但这与本地存储无关,因为可以跨会话访问本地存储。@MichaelZlatkovsky Microsoft,是的,这是关于对话框API的。@RickKirkham,是的,我可以使用本地存储实现此目的,但缺点是我还必须管理清除。但这可能是我们唯一可以利用的方法。目前,我认为本地存储是唯一的方法。出于您需要的目的,您是否本质上要求在对话框和它的父级之间进行双向通信?我想确保我正确地捕捉反馈,并将其传递给团队…