通过Ajax请求发送OfficeJS 2D阵列

时间:2018-05-30 21:57:15

标签: javascript ajax flask office-js

我正在尝试在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.request时<{1}}的打印输出:

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([])]) 发送2D数组时,我在data.values中收到错误消息:

ajax.fail

我也尝试了Error == {"readyState":0,"status":0,"statusText":"error"} 并收到了相同的错误消息:

JSON.stringify(data.values)

我甚至尝试将每个列转换为某种列表作为Error == {"readyState":0,"status":0,"statusText":"error"} 内的嵌套键,但我收到了相同的错误消息。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

理想情况下,您应该将get-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只返回一个普通的2D数组,没什么特别的。所以你可以独立于Excel调用尝试你的ajax调用(这是将它们分开的另一个原因)