2016-08-03 113 views
2

Ich schreibe eine Webanwendung, die manchmal Dutzende von Zeilen (oder sogar mehr) in einer Excel-Datei ausgeben kann. openpyxl wurde für die Excel-Ausgabevorbereitung ausgewählt, aber ich bin mir nicht sicher, ob ich die Daten aus der Datenbank lesen und zur gleichen Zeit ausgeben könnte. Gibt es eine Möglichkeit, das zu tun? Hier ist ein Beispiel dessen, was ich in CSV bedeuten:Streamen Sie eine riesige Excel-Datei und erstellen Sie sie im laufenden Betrieb?

def csv_view(request, iterator, keys): 
    """A view that streams a large CSV file.""" 

    class Echo(object): 
     """An object that implements just the write method of the file-like 
     interface. 
     """ 
     def write(self, value): 
      """Write the value by returning it, 
       instead of storing in a buffer.""" 
      return value 

    def get_iter(): 

     writer = csv.writer(Echo()) 
     yield writer.writerow(keys) 
     for row in iterator: 
      yield writer.writerow(row) 

    response = StreamingHttpResponse(get_iter(), content_type="text/csv") 
    response['Content-Disposition'] = 'attachment; filename="output.csv"' 
    return response 
+0

Mit der Datenbank meinen Sie die CSV-Datei? – jmunsch

+0

Mit Datenbank meine ich "jeden Iterator". Ich brauche im Grunde ein Äquivalent dieser "csv_view" -Funktion, die XLS im laufenden Betrieb anstelle von CSV generieren würde. @jmufsch – d33tah

+0

Kann in der Lage sein, eine 'SpooledTemporaryFile' mit einer maximalen Größe von dem, was Excel bearbeiten kann und dann die Chunked Excel-Dateien zu streamen? Sieht so aus, als würde der 'write_only' Modus' NamedTemporaryFile' mit einer unbegrenzten Größe verwenden? Ich bin mir nicht sicher über den Anwendungsfall. – jmunsch

Antwort

1

openpyxl bietet bereits einen write-only Modus für Streaming-Einsatz konzipiert. Da es sich bei allen XSLX-Dateien jedoch um ZIP-Dateien handelt und das ZIP-Format kein Streaming zulässt, ist es nicht möglich, XLSX-Dateien während des Schreibens zu streamen.

+0

Danke! Und normale .xls? – d33tah

+1

Ich weiß es nicht, aber ich bezweifle es. "Riesige" XLS-Dateien können sowieso nicht gemacht werden: beschränkt auf 256 Spalten und 65.000 ungerade Zeilen. –