2017-05-16 23 views
0

GoogleドライブスプレッドシートをExcelファイルとしてダウンロードしようとしています。私が言う限りでは、GoogleドライブAPIは、export_mediaリクエストに異なるMIMEタイプを指定するだけで、これを非常に簡単にする必要があります。GoogleドライブAPI v3がGoogleスプレッドシートをExcelとしてダウンロード

チュートリアルスクリプトに基づいて、私はをうまく利用できます。は、スプレッドシートをCVSとOpen Officeシートとしてダウンロードします。すばらしいです!

MIMEタイプがapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetに設定されている場合、MS Excelで指定されているように、ダウンローダはステータスの進行を停止せずにストリームから読み込み続けます。

フルスクリプトはhereです。 GoogleドライブのAPIドキュメントhere

問題のあるコードでアプリを作成するために、指示に従って、実行するにはここにある:

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)) 

それはDownload 0%を印刷し続け、停止したことがありません。

+0

これは、異なるマシン間でのテストと同じ動作ですか? –

+0

こんにちは@AL。正直言ってわかりません。私は手元に1つしか持っていない。私はコンテナでそれを実行しようとすることができます。もしあなたが喜んでいるなら、多分あなたはあなたのマシンでそれを走らせることができますか?乾杯 –

答えて

0

MediaBaseIODownloadは、コンテンツの範囲or content-lengthが停止する時期を知るために存在することに依存していることがわかります。

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']) 

しかし、私が見ることができるデバッガでは、応答には存在しません。したがって、いつ行われるのか分からない。

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

ソリューションは、部分的なダウンロードを実行しないことではなく、フルでダウンロードすることでした:

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()) 
関連する問題