【问题标题】:flask excel download with ajax用ajax下载flask excel
【发布时间】:2020-01-24 10:57:52
【问题描述】:

我想将数据从 ajax 发送到烧瓶,并希望将此数据下载到用户端的 excel 文件中。 ajax 正在发送数据,我也可以打印这些数据,但烧瓶没有将这个 excel 文件发送到浏览器。 如果我获取任何数据,没有 ajax 烧瓶也可以工作并发送 excel 文件,但我想用 ajax 发布数据并获取 excel 文件。请帮助解决这个问题

 **#ajax script**

$('#download').click(function() {
    var date1 ={};
    date1= window.fordownload;
    alert(date1);
    $.ajax({
        url: '/downloads',
        type: "POST",
        data: date1,
        contentType: "application/json; charset=utf-8",
        error: function(e) {
                console.log(e);
        },
        dataType: "json",
        contentType: "application/json"
    });
});


**#flask code**
@app.route('/downloads', methods=['GET','POST'])
def downloadData():
  try:
    json_data = request.get_json('date1')
    print(json_data)
    df_1 = pd.DataFrame(json_data)
    print(df_1)
    output = BytesIO()
    writer = pd.ExcelWriter(output, engine='xlsxwriter')
    df_1.to_excel(writer, startrow=0, merge_cells=False, sheet_name="Sheet_1", index=False)
    workbook = writer.book
    worksheet = writer.sheets["Sheet_1"]
    format = workbook.add_format()
    format.set_bg_color('#eeeeee')
    worksheet.set_column(0, 9, 28)
    writer.close()
    output.seek(0)
    return  send_file(output, attachment_filename="testing.xlsx", as_attachment=True)
  except Exception as e:
    return (str(e))

它将数据从 ajax 发布到烧瓶,但是

【问题讨论】:

    标签: ajax flask


    【解决方案1】:

    我已经有这个问题了,当你在 ajax 中发出文件请求时,你需要处理响应,这是我的代码:

    this.$http.get(URL.SENSOR_DATA_DOWNLOAD, {
                            params: this.getParms
                        },
                    ).then(function (response) {
                        try {
                            let headerLine = response.headers['content-disposition'];
                            let startFileNameIndex = headerLine.indexOf('"') + 1;
                            let endFileNameIndex = headerLine.lastIndexOf('"');
                            let filename = headerLine.substring(startFileNameIndex, endFileNameIndex);
                            const type = response.headers['content-type'];
                            const blob = new Blob([response.data], {type: type, encoding: 'UTF-8'});
                            const link = document.createElement('a');
                            link.href = window.URL.createObjectURL(blob);
                            link.download = filename;
                            link.click();
                        } catch (e) {
                            console.log(e);
                        }
                        this.loading = false;
                    }).catch(() => {
                        this.loading = false;
                    });
    
    

    我正在使用 axios,但响应回调与 ajax 相同(then(function (response) 部分)。基本上我得到文件名和文件数据(blob部分)并将其放在链接中以自动下载。如果你也需要后端部分(我在这个例子中使用了 flask-csv):

    @api.resource('/sector/machine/sensor/data/download')
    class DataDownloadAPI(Resource):
        method_decorators = [login_requeried]
    
        @validateInput(DownloadDataForm)
        def get(self):
            form = ApiWrap.form
            mintime = datetime.min.time()
            datetime_out = datetime.combine(form.date_out.data + timedelta(days=1), mintime)
            datetime_in = datetime.combine(form.date_in.data, mintime)
            dataStructs = DataModel.between(form.sensor_id.data, datetime_in, datetime_out)
            sensor = Sensor.query.filter_by(id=form.sensor_id.data).first()
            for dataStruct in dataStructs.data:
                dataStruct['datetime'] = dataStruct['datetime'].strftime("%d/%m/%Y, %H:%M:%S")
                dataStruct['value'] = (dataStruct['value'] * sensor.resolution) + sensor.offset
    
            return send_csv(dataStructs.data,
                            sensor.name + datetime_out.strftime("%d/%m/%Y") + '.csv',
                            ['datetime', 'value'], delimiter=';')
    

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多