Utiliser openpyxl pour lire un fichier depuis la mémoire

j'ai téléchargé une feuille de calcul google comme un objet en python.

Comment puis-je utiliser openpyxl utiliser le classeur sans l'avoir pour sauvegarder sur le disque en premier?

je sais que xlrd pouvez faire ceci:

book = xlrd.open_workbook(file_contents=downloaded_spreadsheet.read())

avec "downloaded_spreadsheet" étant mon fichier XLSX téléchargé comme un objet.

au lieu de xlrd, je veux utiliser openpyxl à cause d'un meilleur support xlsx(je lis).

Je l'utilise pour l'instant...

#!/usr/bin/python

    import openpyxl
    import xlrd
    # which to use..?


import re, urllib, urllib2

class Spreadsheet(object):
    def __init__(self, key):
        super(Spreadsheet, self).__init__()
        self.key = key

class Client(object):
    def __init__(self, email, password):
        super(Client, self).__init__()
        self.email = email
        self.password = password

    def _get_auth_token(self, email, password, source, service):
        url = "https://www.google.com/accounts/ClientLogin"
        params = {
        "Email": email, "Passwd": password,
        "service": service,
        "accountType": "HOSTED_OR_GOOGLE",
        "source": source
        }
        req = urllib2.Request(url, urllib.urlencode(params))
        return re.findall(r"Auth=(.*)", urllib2.urlopen(req).read())[0]

    def get_auth_token(self):
        source = type(self).__name__
        return self._get_auth_token(self.email, self.password, source, service="wise")

    def download(self, spreadsheet, gid=0, format="xls"):

        url_format = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=%s&exportFormat=%s&gid=%i"
        headers = {
        "Authorization": "GoogleLogin auth=" + self.get_auth_token(),
        "GData-Version": "3.0"
        }
        req = urllib2.Request(url_format % (spreadsheet.key, format, gid), headers=headers)
        return urllib2.urlopen(req)

if __name__ == "__main__":



    email = "........@gmail.com" # (your email here)
    password = '.....'
    spreadsheet_id = "......" # (spreadsheet id here)

    # Create client and spreadsheet objects
    gs = Client(email, password)
    ss = Spreadsheet(spreadsheet_id)

    # Request a file-like object containing the spreadsheet's contents
    downloaded_spreadsheet = gs.download(ss)


    # book = xlrd.open_workbook(file_contents=downloaded_spreadsheet.read(), formatting_info=True)

    #It works.. alas xlrd doesn't support the xlsx-funcionality that i want...
    #i.e. being able to read the cell-colordata..

j'espère que quelqu'un peut aider parce que je me démène pendant des mois pour obtenir les données de couleur de la cellule donnée dans Google-Tableur. (Je sais que le google-api ne les supporte pas..)

16
demandé sur Kaspar128 2013-12-17 17:42:23

2 réponses

Dans la doc de load_workbook il dit:

#:param filename: the path to open or a file-like object

..il en était donc capable tout le temps. Il lit un chemin ou prend un fichier objet semblable. Je n'avais qu'à convertir mon fichier comme objet renvoyé par urlopen, un bytestream avec:

from io import BytesIO
wb = load_workbook(filename=BytesIO(input_excel.read()))

et je peux lire chaque morceau de données dans mon tableur Google.

28
répondu Kaspar128 2016-12-06 18:13:58

en Fait, assez, c'est:

file = open('path/to/file.xlsx', 'rb')
wb = openpyxl.load_workbook(filename=file)

et ça va marcher. Pas besoin de BytesIO et tout ça.

0
répondu PerBeatus 2016-12-16 08:20:27