2015-09-14 11 views
5

Ich obwohl this Frage würde mein Problem lösen, und ich folgte der Simple HTTP Server Beispiel, aber ich bekomme verschiedene Probleme, für die ich keine Lösung finden kann.Decoding Probleme bei der Rückgabe Xlsxwriter Antwort mit Pyramide

Ich möchte eine Excel-Datei in meinem Server generieren und es an den Benutzer mit einer HTTP-Antwort zurückgeben. Ich verwende xlsxwriter, um die Datei und ein Pyramiden-Framework in meinem Server zu erstellen. Ich habe es geschafft, die Datei zu erstellen und es zurückzugeben, aber zuerst Ausgabe ist LibreCalc (Ich teste auf Ubuntu 14) fragt mich, wie ich die Datei importieren möchte. Es spielt keine Rolle, was ich wähle Ich bekomme diese Fehlermeldung

Allgemeine Fehler. Allgemeiner Eingangs-/Ausgangsfehler.

Wenn ich nur die Datei erstellen und speichern, ohne sie als Antwort zurückzugeben, öffnet es sich gut.

Mein Code, um die Datei zu erstellen:

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 

Und ich behandeln die Antwort:

$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(); 
    }) 

Ich dachte zuerst, es hat etwas mit der Tatsache zu tun haben könnte, dass ich UTF-8 Kodierung in der Python-Datei, aber da ich die Datei anders aufbauen und öffnen kann, glaube ich nicht.

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

+0

UTF-8 Enconding in Python-Datei kann nicht verwandt werden. –

+0

Können Sie die Datei direkt von der URL der Browser-Adressleiste herunterladen und sehen, ob es besser funktioniert? –

+0

Wenn nicht, müssen Sie die Datei mit einem Texteditor untersuchen und sehen, was drin ist, wenn es einen Hinweis gibt - es ist XML, also sollte es für Menschen lesbar sein. –

Antwort

1

ich war, indem Sie die Antworten auf this Frage zu einer Lösung gelangen können. Ich bin mir nicht sicher, was genau den Trick, aber hier ist mein Dieser Code:

$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); 
}) 

Und es funktioniert perfekt, ich nur den http-Code ändern benötigt. Übrigens habe ich angular-file-saver für die saveAs-Funktion verwendet.