代码之家  ›  专栏  ›  技术社区  ›  Tony

通过Ajax请求发送OfficeJS二维数组

  •  0
  • Tony  · 技术社区  · 7 年前

    从清单路由加载的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>
    

    但是我不知道如何发送这个,在背面我有一个flask服务器来接收请求,希望我可以使用 pandas.read_json 但不管我怎么发送,我都会收到不同的错误。这是打印出来的 flask.request 什么时候 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) 得到同样的错误信息:

    我甚至尝试将每一列转换成某种列表作为嵌套键 accessData 但我收到了同样的错误信息。任何帮助都将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Michael Zlatkovsky    7 年前

    理想情况下,您应该将从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调用(这也是将这些调用分开的另一个原因)