使用金字塔返回xlsxwriter响应时解码问题

Nie*_*iel 5 python pyramid xlsxwriter

我虽然这个问题可以解决我的问题,但我遵循了简单的HTTP服务器示例,但我遇到了一些我无法找到解决方案的问题.

我想在我的服务器中生成一个Excel文件,并通过Http响应将其返回给用户.我正在使用xlsxwriter在我的服务器中构建文件和金字塔框架.我已经设法构建文件并将其返回,但是第一个问题是LibreCalc(我在Ubuntu 14上测试)问我如何导入文件.我选择什么并不重要我收到此错误消息

一般错误.一般输入/输出错误.

如果我只是构建并保存文件而不将其作为响应返回,则打开正常.

我的代码来构建文件:

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
Run Code Online (Sandbox Code Playgroud)

我处理回应:

    $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();
    })
Run Code Online (Sandbox Code Playgroud)

我一开始认为它可能与我在python文件中使用UTF-8编码这一事实有关,但由于我可以构建并打开文件,否则我认为不行.

# -*- coding: utf-8 -*-

Nie*_*iel 1

我能够通过遵循这个问题的答案找到解决方案。我不确定到底是怎么回事,但这是我的结果代码:

 $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);
 })
Run Code Online (Sandbox Code Playgroud)

它工作完美,我只需要更改 http 代码。顺便说一下,我使用Angular-file-saver作为 saveAs 函数。