Я хочу отправить некоторые данные обратно в мой API и вернуть файл .xlsx в качестве ответа, чтобы клиент мог его загрузить. Требование, которое заставляет все рушиться, состоит в том, что я должен создать файл .xlsx как временный файл. Проблема, с которой я столкнулся, это , когда файл открывается после загрузки, он полностью поврежден.
Я использую AngularJS и Python Flask
Вот обработка на стороне сервера :
@app.route('/downloadxlsx', methods=['POST'])
def downloadOrderToExcel():
try:
data = request.get_json()
productsBought = data.pop('products')
data['datetime'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
output = io.BytesIO()
wb = xlsxwriter.Workbook(output, {'in_memory': True})
ws = wb.add_worksheet(data['fullname'])
row = col = 0
for columnName in excelColumnNames():
ws.write(row, col, columnName)
col += 1
col = 0
row = 1
for cellValue in data:
ws.write(row, col, data[cellValue])
col += 1
for product in productsBought:
result = queryForProducts(product)
for r in result:
ws.write(row, col, r['categoryname'] + " pack of " + r['pack'])
row += 1
output.seek(0)
wb.close()
return send_file(output, as_attachment=True, attachment_filename='order.xlsx')
except Exception as ex:
print(str(ex))
return 'False'
Вот запрос :
vm.downloadExcel = function() {
this.jsonCustomer = JSON.stringify(vm.customer);
$http.post('/downloadxlsx', this.jsonCustomer)
.then(response => {
let blob = new Blob([response], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
let url = URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = url;
a.target = '_blank';
a.click();
})
}