2017-05-16 2 views
0

Ich versuche, eine Google Drive-Tabelle als Excel-Datei herunterladen. Soweit ich das beurteilen kann, sollte die Google Drive API dies sehr einfach machen, indem Sie einfach einen anderen MIME-Typ als export_media angeben.Google Drive API v3 herunterladen Google Tabellenkalkulation als Excel

Basierend auf dem Tutorial-Skript kann ich erfolgreich laden Sie die Tabelle als CVS und Open Office Blatt. Groß!

Allerdings mit dem Mime-Typ auf festgelegt - wie für MS Excel angegeben liest der Downloader weiter aus dem Stream ohne jemals zu stoppen und ohne den Statusfortschritt zu erhöhen.

Das vollständige Skript lautet here. So zu führen, folgen Sie den Anweisungen eine App in der Google Drive API-Dokumentation erstellen here

Der problematische Code ist hier:

file_id = 'my spreadsheet id' 

    request = service.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 

    fh = FileIO('data.xls', 'wb') 
    downloader = MediaIoBaseDownload(fh, request) 
    done = False 
    while done is False: 
     status, done = downloader.next_chunk() 
     print("Download %d%%." % int(status.progress() * 100)) 

Weiter geht es Download 0% zu drucken und hört nie auf.

+0

Ist dies das gleiche Verhalten, wenn Sie in verschiedenen Maschinen testen? –

+0

Hallo @AL. Ich weiß es nicht, um ehrlich zu sein. Ich habe nur einen zur Hand. Ich könnte versuchen, es in einem Container zu laufen. Wenn Sie bereit sind - vielleicht könnten Sie es auf Ihrer Maschine laufen lassen? Prost –

Antwort

0

Es stellt sich heraus, dass die MediaBaseIODownload auf "Inhaltsbereich or content-length" angewiesen ist zu wissen, wann zu stoppen.

if 'content-range' in resp: 
    content_range = resp['content-range'] 
    length = content_range.rsplit('/', 1)[1] 
    self._total_size = int(length) 
    elif 'content-length' in resp: 
    self._total_size = int(resp['content-length']) 

Allerdings kann ich in einem Debugger sehen, sie sind nicht in der Antwort vorhanden. Daher kann es nicht wissen, wann es gemacht wird.

if self._progress == self._total_size: 
    self._done = True 

Die Lösung war nicht einen Teil-Download laufen, aber in voller Höhe zum Download:

request = service.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
with open('data.xlsx', 'wb') as f: 
    f.write(request.execute()) 
Verwandte Themen