使用金字塔返回 xlsxwriter 响应时的解码问题
Decoding problems when returning xlsxwriter response with pyramid
我虽然 this question would solve my problem, and I followed the Simple HTTP Server 例子,但我遇到了不同的问题,我找不到解决方案。
我想在我的服务器中生成一个 Excel 文件,然后 return 通过 Http 响应将其发送给用户。我正在使用 xlsxwriter 在我的服务器中构建文件和金字塔框架。我已经设法构建了文件并 return 它,但是第一个问题是 LibreCalc(我正在 Ubuntu 14 上进行测试)问我如何导入文件。不管我 select 我收到此错误消息
General Error.
General input/output error.
如果我只是构建并保存文件而没有 return 将其作为响应,它可以正常打开。
我构建文件的代码:
output = StringIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
# add the data
workbook.close()
excelcontent = output.getvalue()
response = Response(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
body=excelcontent)
response.headers.add('Content-Disposition',
"attachment; filename=%s.xlsx" % nice_filename)
response.headers.add('Access-Control-Expose-Headers','Content-Disposition')
response.headers.add("Content-Length", str(len(excelcontent)))
response.headers.add('Last-Modified', last_modified)
response.headers.add("Cache-Control", "no-store")
response.headers.add("Pragma", "no-cache")
return response
我处理回复:
$http({
method: 'POST',
url: url,
data: data},
{responseType: 'arraybuffer'}
).success(function (response, status, headers, config) {
var file = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
var fileURL = URL.createObjectURL(file);
var result = document.getElementsByClassName("excel_hidden_download");
var anchor = angular.element(result);
var filename_header = headers('Content-Disposition');
var filename = filename_header.split('filename=')[1];
anchor.attr({
href: fileURL,
target: '_blank',
download: filename
})[0].click();
})
起初我认为这可能与我在 python 文件中使用 UTF-8 编码有关,但由于我可以以其他方式构建和打开文件,所以我不认为确实如此。
# -*- coding: utf-8 -*-
我按照 this 问题的答案找到了解决方案。我不确定到底是什么把戏,但这是我的结果代码:
$http({
method: 'POST',
url: url,
data: data,
responseType: 'arraybuffer'
}).success(function (response, status, headers, config) {
var blob = new Blob([response], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
var filename = headers('Content-Disposition').split('filename=')[1];
var config = {
data: blob,
filename: filename,
};
FileSaver.saveAs(config);
})
而且效果很好,我只需要更改 http 代码即可。顺便说一下,我使用 angular-file-saver 作为 saveAs 函数。
我虽然 this question would solve my problem, and I followed the Simple HTTP Server 例子,但我遇到了不同的问题,我找不到解决方案。
我想在我的服务器中生成一个 Excel 文件,然后 return 通过 Http 响应将其发送给用户。我正在使用 xlsxwriter 在我的服务器中构建文件和金字塔框架。我已经设法构建了文件并 return 它,但是第一个问题是 LibreCalc(我正在 Ubuntu 14 上进行测试)问我如何导入文件。不管我 select 我收到此错误消息
General Error. General input/output error.
如果我只是构建并保存文件而没有 return 将其作为响应,它可以正常打开。
我构建文件的代码:
output = StringIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
# add the data
workbook.close()
excelcontent = output.getvalue()
response = Response(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
body=excelcontent)
response.headers.add('Content-Disposition',
"attachment; filename=%s.xlsx" % nice_filename)
response.headers.add('Access-Control-Expose-Headers','Content-Disposition')
response.headers.add("Content-Length", str(len(excelcontent)))
response.headers.add('Last-Modified', last_modified)
response.headers.add("Cache-Control", "no-store")
response.headers.add("Pragma", "no-cache")
return response
我处理回复:
$http({
method: 'POST',
url: url,
data: data},
{responseType: 'arraybuffer'}
).success(function (response, status, headers, config) {
var file = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
var fileURL = URL.createObjectURL(file);
var result = document.getElementsByClassName("excel_hidden_download");
var anchor = angular.element(result);
var filename_header = headers('Content-Disposition');
var filename = filename_header.split('filename=')[1];
anchor.attr({
href: fileURL,
target: '_blank',
download: filename
})[0].click();
})
起初我认为这可能与我在 python 文件中使用 UTF-8 编码有关,但由于我可以以其他方式构建和打开文件,所以我不认为确实如此。
# -*- coding: utf-8 -*-
我按照 this 问题的答案找到了解决方案。我不确定到底是什么把戏,但这是我的结果代码:
$http({
method: 'POST',
url: url,
data: data,
responseType: 'arraybuffer'
}).success(function (response, status, headers, config) {
var blob = new Blob([response], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
var filename = headers('Content-Disposition').split('filename=')[1];
var config = {
data: blob,
filename: filename,
};
FileSaver.saveAs(config);
})
而且效果很好,我只需要更改 http 代码即可。顺便说一下,我使用 angular-file-saver 作为 saveAs 函数。