In questo articolo imparerai come esportare i dati di Excel in Fogli Google in modo programmatico in Python.

Esporta file Excel in Fogli Google in Python

I file Excel sono ampiamente utilizzati per archiviare i dati ed eseguire vari tipi di operazioni su di essi, come la generazione di grafici, l’applicazione di formule. D’altra parte, Fogli Google è una popolare applicazione online per la creazione e la manipolazione di fogli di lavoro. Fogli Google fornisce anche la condivisione in tempo reale di fogli di lavoro con più persone. In alcuni casi, potrebbe essere necessario esportare file XLS o XLSX di Excel in Fogli Google in modo programmatico. Per raggiungere questo obiettivo, questo articolo fornisce una guida completa su come impostare un progetto Google ed esportare dati da file Excel a Fogli Google in Python.

Prerequisiti: esporta i dati di Excel in Fogli Google in Python

Progetto Google Cloud

Per comunicare con Fogli Google, dovremo creare un progetto su Google Cloud e abilitare l’API Fogli Google. Inoltre, dobbiamo creare le credenziali che vengono utilizzate per autorizzare le azioni che eseguiremo con il nostro codice. Puoi leggere le linee guida su come creare un progetto Google Cloud e abilitare l’API Fogli Google.

Dopo aver creato il progetto Google Cloud e aver abilitato l’API Fogli Google, possiamo procedere all’installazione delle seguenti API nella nostra applicazione Python.

Librerie Python per esportare file Excel in Fogli Google

Per esportare i dati dai file XLS/XLSX di Excel a Fogli Google, avremo bisogno delle seguenti API.

Esporta dati da Excel a Fogli Google in Python

Quella che segue è la guida passo passo su come leggere i dati da un file XLSX di Excel e scriverli su Fogli Google in un’applicazione Python.

  1. Crea una nuova applicazione Python.

  2. Installa Aspose.Cells e le librerie client di Google nel progetto.

pip install aspose.cells
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
  1. Inserisci il file JSON (che abbiamo scaricato dopo aver creato le credenziali in Google Cloud) nella directory del progetto.

  2. Scrivi un metodo chiamato createpreadsheet che crea un nuovo foglio di lavoro su Fogli Google, imposta il nome del foglio predefinito e restituisce l’ID del foglio di lavoro.

def create_spreadsheet(_service, _title, _sheetName):   
    # Spreadsheet details
    spreadsheetBody = {
        'properties': {
            'title': "{0}".format(_title)
        },
        'sheets': {
            'properties': {
                'title' : "{0}".format(_sheetName)
            }
        }
    }

    # Create spreadsheet
    spreadsheet = _service.spreadsheets().create(body=spreadsheetBody,
                                                fields='spreadsheetId').execute()
    
    print('Spreadsheet ID: {0}'.format(spreadsheet.get('spreadsheetId')))
    print('Spreadsheet URL: "https://docs.google.com/spreadsheets/d/{0}'.format(spreadsheet.get('spreadsheetId')))
    
    # Open in web browser
    webbrowser.open_new_tab("https://docs.google.com/spreadsheets/d/{0}".format(spreadsheet.get('spreadsheetId')))

    return spreadsheet.get('spreadsheetId')
  1. Scrivi un altro metodo chiamato addsheet per aggiungere un nuovo foglio nel foglio di lavoro di Google.
def add_sheet(_service, _spreadsheetID, _sheetName):
    data = {'requests': [
        {
            'addSheet':{
                'properties':{'title': '{0}'.format(_sheetName)}
            }
        }
    ]}

    # Execute request
    res = _service.spreadsheets().batchUpdate(spreadsheetId=_spreadsheetID, body=data).execute()
  1. Ora inizializza il servizio Fogli Google utilizzando le credenziali (file JSON) e definisci gli ambiti dell’applicazione. Il parametro scopes viene utilizzato per specificare le autorizzazioni di accesso a Fogli Google e alle relative proprietà.
# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

creds = None
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.json'):
    creds = Credentials.from_authorized_user_file('token.json', SCOPES)

# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(
            'credentials1.json', SCOPES)
        creds = flow.run_local_server(port=0)
    # Save the credentials for the next run
    with open('token.json', 'w') as token:
        token.write(creds.to_json())

    service = build('sheets', 'v4', credentials=creds)
  1. Quindi, carica il file XLS o XLSX di Excel utilizzando Aspose.Cells e ottieni il nome del primo foglio di lavoro nella cartella di lavoro.
# Load Excel workbook
wb = Workbook(fileName)

# Get worksheets collection
collection = wb.getWorksheets()
collectionCount = collection.getCount()

# Get workbook and first sheet's name
spreadsheetName = wb.getFileName()
firstSheetName = collection.get(0).getName()
  1. Chiama il metodo createpreadsheet per creare un nuovo foglio di lavoro su Fogli Google.
# Create spreadsheet on Google Sheets
spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)
  1. Scorri i fogli di lavoro nel file Excel. In ogni iterazione, leggi i dati dal foglio di lavoro e aggiungili a una matrice.
# Loop through all the worksheets
for worksheetIndex in range(collectionCount):

    # Get worksheet using its index
    worksheet = collection.get(worksheetIndex)

    # Set worksheet range
    if(worksheetIndex==0):
        sheetRange= "{0}!A:Y".format(firstSheetName)
    else:
        add_sheet(service, spreadsheetID, worksheet.getName())
        sheetRange= "{0}!A:Y".format(worksheet.getName())

    # Get number of rows and columns
    rows = worksheet.getCells().getMaxDataRow()
    cols = worksheet.getCells().getMaxDataColumn()

    # List to store worksheet's data
    worksheetDatalist = []

    # Loop through rows
    for i in range(rows):
        # List to store each row in worksheet 
        rowDataList = []

        # Loop through each column in selected row
        for j in range(cols):
            cellValue = worksheet.getCells().get(i, j).getValue()
            if( cellValue is not None):
                rowDataList.append(str(cellValue))
            else:
                rowDataList.append("")

        # Add to worksheet data
        worksheetDatalist.append(rowDataList)
  1. Per ogni foglio di lavoro nel file Excel, crea una richiesta per scrivere dati su Fogli Google.
# Set values
body = {
    'values': worksheetDatalist
}

# Execute request
result = service.spreadsheets().values().update(
    spreadsheetId=spreadsheetID, range=sheetRange,
    valueInputOption='USER_ENTERED', body=body).execute()

# Print number of updated cells    
print('{0} cells updated.'.format(result.get('updatedCells')))

Quella che segue è la funzione completa per esportare i dati da un file Excel a un foglio di calcolo in Fogli Google.

def export_to_google(fileName):
    # If modifying these scopes, delete the file token.json.
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials1.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)
        
        # Load Excel workbook
        wb = Workbook(fileName)

        # Get worksheets collection
        collection = wb.getWorksheets()
        collectionCount = collection.getCount()

        # Get workbook and first sheet's name
        spreadsheetName = wb.getFileName()
        firstSheetName = collection.get(0).getName()

        # Create spreadsheet on Google Sheets
        spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

        # To set worksheet range
        sheetRange = None

        # Loop through all the worksheets
        for worksheetIndex in range(collectionCount):

            # Get worksheet using its index
            worksheet = collection.get(worksheetIndex)

            # Set worksheet range
            if(worksheetIndex==0):
                sheetRange= "{0}!A:Y".format(firstSheetName)
            else:
                add_sheet(service, spreadsheetID, worksheet.getName())
                sheetRange= "{0}!A:Y".format(worksheet.getName())

            # Get number of rows and columns
            rows = worksheet.getCells().getMaxDataRow()
            cols = worksheet.getCells().getMaxDataColumn()

            # List to store worksheet's data
            worksheetDatalist = []

            # Loop through rows
            for i in range(rows):
                # List to store each row in worksheet 
                rowDataList = []

                # Loop through each column in selected row
                for j in range(cols):
                    cellValue = worksheet.getCells().get(i, j).getValue()
                    if( cellValue is not None):
                        rowDataList.append(str(cellValue))
                    else:
                        rowDataList.append("")

                # Add to worksheet data
                worksheetDatalist.append(rowDataList)

            # Set values
            body = {
                'values': worksheetDatalist
            }
            
            # Execute request
            result = service.spreadsheets().values().update(
                spreadsheetId=spreadsheetID, range=sheetRange,
                valueInputOption='USER_ENTERED', body=body).execute()

            # Print number of updated cells    
            print('{0} cells updated.'.format(result.get('updatedCells')))
    except HttpError as err:
        print(err)

    print("Workbook has been exported to Google Sheets.")

Codice sorgente completo

Di seguito è riportato il codice sorgente completo per esportare un file XLSX di Excel in Fogli Google in Python.

from __future__ import print_function
import jpype
import webbrowser
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import asposecells

jpype.startJVM()
from asposecells.api import Workbook, License


def export_to_google(fileName):
    # If modifying these scopes, delete the file token.json.
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials1.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)
        
        # Load Excel workbook
        wb = Workbook(fileName)

        # Get worksheets collection
        collection = wb.getWorksheets()
        collectionCount = collection.getCount()

        # Get workbook and first sheet's name
        spreadsheetName = wb.getFileName()
        firstSheetName = collection.get(0).getName()

        # Create spreadsheet on Google Sheets
        spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

        # To set worksheet range
        sheetRange = None

        # Loop through all the worksheets
        for worksheetIndex in range(collectionCount):

            # Get worksheet using its index
            worksheet = collection.get(worksheetIndex)

            # Set worksheet range
            if(worksheetIndex==0):
                sheetRange= "{0}!A:Y".format(firstSheetName)
            else:
                add_sheet(service, spreadsheetID, worksheet.getName())
                sheetRange= "{0}!A:Y".format(worksheet.getName())

            # Get number of rows and columns
            rows = worksheet.getCells().getMaxDataRow()
            cols = worksheet.getCells().getMaxDataColumn()

            # List to store worksheet's data
            worksheetDatalist = []

            # Loop through rows
            for i in range(rows):
                # List to store each row in worksheet 
                rowDataList = []

                # Loop through each column in selected row
                for j in range(cols):
                    cellValue = worksheet.getCells().get(i, j).getValue()
                    if( cellValue is not None):
                        rowDataList.append(str(cellValue))
                    else:
                        rowDataList.append("")

                # Add to worksheet data
                worksheetDatalist.append(rowDataList)

            # Set values
            body = {
                'values': worksheetDatalist
            }
            
            # Execute request
            result = service.spreadsheets().values().update(
                spreadsheetId=spreadsheetID, range=sheetRange,
                valueInputOption='USER_ENTERED', body=body).execute()

            # Print number of updated cells    
            print('{0} cells updated.'.format(result.get('updatedCells')))
    except HttpError as err:
        print(err)

    print("Workbook has been exported to Google Sheets.")

def create_spreadsheet(_service, _title, _sheetName):   
    # Spreadsheet details
    spreadsheetBody = {
        'properties': {
            'title': "{0}".format(_title)
        },
        'sheets': {
            'properties': {
                'title' : "{0}".format(_sheetName)
            }
        }
    }

    # Create spreadsheet
    spreadsheet = _service.spreadsheets().create(body=spreadsheetBody,
                                                fields='spreadsheetId').execute()
    
    # Open in web browser
    webbrowser.open_new_tab("https://docs.google.com/spreadsheets/d/{0}".format(spreadsheet.get('spreadsheetId')))

    return spreadsheet.get('spreadsheetId')

def add_sheet(_service, _spreadsheetID, _sheetName):
    data = {'requests': [
        {
            'addSheet':{
                'properties':{'title': '{0}'.format(_sheetName)}
            }
        }
    ]}

    # Execute request
    res = _service.spreadsheets().batchUpdate(spreadsheetId=_spreadsheetID, body=data).execute()

 # Create a Aspose.Cells icense object
license = License()

# Set the license of Aspose.Cells to avoid the evaluation limitations
license.setLicense("D:\\Licenses\\Conholdate.Total.Product.Family.lic")

export_to_google("Book1.xlsx")

Ottieni una licenza Aspose.Cells gratuita

Puoi ottenere una licenza temporanea gratuita e utilizzare Aspose.Cells per Python senza limitazioni di valutazione.

Conclusione

In questo articolo, hai imparato come esportare i dati di Excel in Fogli Google in Python. Abbiamo spiegato come creare un progetto su Google Cloud, abilitare l’API di Fogli Google, leggere file Excel ed esportare dati da file Excel a Fogli Google. Per saperne di più su Aspose.Cells per Python, puoi visitare la documentazione. Inoltre, puoi porre le tue domande tramite il nostro forum.

Guarda anche