首页 > 解决方案 > 通过 Ajax 请求发送 OfficeJS 2D 数组

问题描述

我正在尝试在 OfficeJS 中发送一个“大”表:

从清单路由加载的 functionfile.html

<script>
(function (){
"use strict";

Office.initialize = function (reason) {
    $(document).ready(function() {
        $("#send-data-button").click(send_data);
    });
};

function send_data() {
    return Excel.run( function(context) {
    var data = context.workbook.worksheets.getItem("SheetName")
                      .getRange("A1:K3673").load("values");

    return context.sync().then( function() {
        // 2d table is correctly seen
        // $("body").append(data.values);

        // Just gets lost in ajax call
        $.ajax({
           type: "GET",
           url: mysite,
           data: {"accessData": data.values},

         }).done( function(success) {
            $("body").append("All Done");

         }).fail( function(error) {
            $("body").append("Error == " + JSON.stringify(error));
         });

         return context.sync();
    });
    });
}
})();
</script>
<div> <button id="send-data-button"> Send </button></div>

但是我不知道如何发送这个,在背面我有一个烧瓶服务器捕获请求并希望我可以使用pandas.read_json但无论我如何尝试发送这个我都会收到不同的错误。这是flask.requestwhen的打印输出data.values[0][0]

CombinedMultiDict([ImmutableMultiDict([('update_date', '43191'), ('accessData', 'Channel')]), ImmutableMultiDict([])])

当我尝试时,data.values[0]我会得到一个值列表,这是我所期望的

CombinedMultiDict([ImmutableMultiDict([('update_date', '43191'), ('accessData[]', 'Channel'), ... <All my column headers>, ImmutableMultiDict([])])

但是当我尝试发送二维数组时,data.values我收到一条错误消息ajax.fail

Error == {"readyState":0,"status":0,"statusText":"error"}

我也试过JSON.stringify(data.values)并得到了同样的错误信息:

Error == {"readyState":0,"status":0,"statusText":"error"}

我什至尝试获取每一列并将它们转换为某种列表作为内部的嵌套键,accessData但我得到了相同的错误消息。任何帮助将不胜感激。

标签: javascriptajaxflaskoffice-js

解决方案


理想情况下,您应该将 getting-data-from-Excel 部分与 ajax 调用部分隔离开来。现在,两者交织在一起,这使得帮助调试变得更加困难,而且在概念上也不那么干净。

对于 Excel 部分,您应该能够:

function getExcelData(){ return Excel.run( function(context) { var data = context.workbook.worksheets.getItem("SheetName") .getRange("A1:K3673").load("values"); return context.sync() .then(function() { return data.values; }); }) }

这将使您腾出时间去做:

getExcelData().then(function(values) { $.ajax(...) });

请注意,range.values它只返回一个常规的二维数组,没什么特别的。因此,您可以独立于 Excel 调用尝试您的 ajax 调用(这是将它们分开的另一个原因)


推荐阅读