在本文中,您将学习如何使用 Python 以编程方式将 Excel 数据导出到 Google 表格。

在 Python 中将 Excel 文件导出到 Google 表格

Excel 文件广泛用于存储数据并对其执行各种类型的操作,例如生成图表、应用公式。另一方面,Google Sheets 是一种流行的在线应用程序,用于创建和操作电子表格。 Google 表格还提供与多人实时共享电子表格的功能。在某些情况下,您可能需要以编程方式将 Excel XLS 或 XLSX 文件导出到 Google 表格。为此,本文提供了有关如何设置 Google 项目并将数据从 Excel 文件导出到 Python 中的 Google 表格的完整指南。

先决条件 - 在 Python 中将 Excel 数据导出到 Google 表格

谷歌云项目

要与 Google Sheets 通信,我们必须在 Google Cloud 上创建一个项目并启用 Google Sheets API。此外,我们需要创建用于授权我们将使用代码执行的操作的凭据。您可以阅读有关如何创建 Google Cloud 项目并启用 Google Sheets API 的指南。

创建 Google Cloud 项目并启用 Google Sheets API 后,我们可以继续在 Python 应用程序中安装以下 API。

用于将 Excel 文件导出到 Google 表格的 Python 库

要将 Excel XLS/XLSX 文件中的数据导出到 Google 表格,我们将需要以下 API。

在 Python 中将数据从 Excel 导出到 Google 表格

以下是有关如何在 Python 应用程序中从 Excel XLSX 文件读取数据并将其写入 Google 表格的分步指南。

  1. 创建一个新的 Python 应用程序。

  2. 在项目中安装 Aspose.Cells 和 Google 客户端库。

pip install aspose.cells
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
  1. 将 JSON 文件(我们在 Google Cloud 中创建凭据后下载)放入项目目录。

  2. 编写一个名为createspreadsheet 的方法,在Google Sheets 上创建一个新的电子表格,设置默认工作表的名称,并返回电子表格的ID。

def create_spreadsheet(_service, _title, _sheetName):   
    # 电子表格详细信息
    spreadsheetBody = {
        'properties': {
            'title': "{0}".format(_title)
        },
        'sheets': {
            'properties': {
                'title' : "{0}".format(_sheetName)
            }
        }
    }

    # 创建电子表格
    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')))
    
    # 在网络浏览器中打开
    webbrowser.open_new_tab("https://docs.google.com/spreadsheets/d/{0}".format(spreadsheet.get('spreadsheetId')))

    return spreadsheet.get('spreadsheetId')
  1. 编写另一个名为 addsheet 的方法以在 Google 电子表格中添加新工作表。
def add_sheet(_service, _spreadsheetID, _sheetName):
    data = {'requests': [
        {
            'addSheet':{
                'properties':{'title': '{0}'.format(_sheetName)}
            }
        }
    ]}

    # 执行请求
    res = _service.spreadsheets().batchUpdate(spreadsheetId=_spreadsheetID, body=data).execute()
  1. 现在,使用凭据(JSON 文件)初始化 Google 表格服务并定义应用程序的范围。 scopes 参数用于指定对 Google 表格及其属性的访问权限。
# 如果修改这些范围,请删除文件 token.json。
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

creds = None
# 文件 token.json 存储用户的访问和刷新令牌,并且是
# 当授权流程第一次完成时自动创建
# 时间。
if os.path.exists('token.json'):
    creds = Credentials.from_authorized_user_file('token.json', SCOPES)

# 如果没有(有效)凭据可用,则让用户登录。
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)
    # 保存凭据以供下次运行
    with open('token.json', 'w') as token:
        token.write(creds.to_json())

    service = build('sheets', 'v4', credentials=creds)
  1. 然后,使用 Aspose.Cells 加载 Excel XLS 或 XLSX 文件,并获取工作簿中第一个工作表的名称。
# 加载 Excel 工作簿
wb = Workbook(fileName)

# 获取工作表集合
collection = wb.getWorksheets()
collectionCount = collection.getCount()

# 获取工作簿和第一张工作表的名称
spreadsheetName = wb.getFileName()
firstSheetName = collection.get(0).getName()
  1. 调用createspreadsheet 方法在Google Sheets 上创建一个新的电子表格。
# 在 Google 表格上创建电子表格
spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)
  1. 循环浏览 Excel 文件中的工作表。在每次迭代中,从工作表中读取数据并将其添加到数组中。
# 循环遍历所有工作表
for worksheetIndex in range(collectionCount):

    # 使用其索引获取工作表
    worksheet = collection.get(worksheetIndex)

    # 设置工作表范围
    if(worksheetIndex==0):
        sheetRange= "{0}!A:Y".format(firstSheetName)
    else:
        add_sheet(service, spreadsheetID, worksheet.getName())
        sheetRange= "{0}!A:Y".format(worksheet.getName())

    # 获取行数和列数
    rows = worksheet.getCells().getMaxDataRow()
    cols = worksheet.getCells().getMaxDataColumn()

    # 存储工作表数据的列表
    worksheetDatalist = []

    # 循环遍历行
   for i in range(rows):
        # 将每一行存储在工作表中的列表 
        rowDataList = []

        # 循环遍历选定行中的每一列
       for j in range(cols):
            cellValue = worksheet.getCells().get(i, j).getValue()
            if( cellValue is not None):
                rowDataList.append(str(cellValue))
            else:
                rowDataList.append("")

        # 添加到工作表数据
        worksheetDatalist.append(rowDataList)
  1. 对于 Excel 文件中的每个工作表,创建一个将数据写入 Google 表格的请求。
# 设定值
body = {
    'values': worksheetDatalist
}

# 执行请求
result = service.spreadsheets().values().update(
    spreadsheetId=spreadsheetID, range=sheetRange,
    valueInputOption='USER_ENTERED', body=body).execute()

# 打印更新单元格的数量    
print('{0} cells updated.'.format(result.get('updatedCells')))

以下是将数据从 Excel 文件导出到 Google 表格中的电子表格的完整功能。

def export_to_google(fileName):
    # 如果修改这些范围,请删除文件 token.json。
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

    creds = None
    # 文件 token.json 存储用户的访问和刷新令牌,并且是
    # 当授权流程第一次完成时自动创建
    # 时间。
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    # 如果没有(有效)凭据可用,则让用户登录。
    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)
        # 保存凭据以供下次运行
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)
        
        # 加载 Excel 工作簿
        wb = Workbook(fileName)

        # 获取工作表集合
        collection = wb.getWorksheets()
        collectionCount = collection.getCount()

        # 获取工作簿和第一张工作表的名称
        spreadsheetName = wb.getFileName()
        firstSheetName = collection.get(0).getName()

        # 在 Google 表格上创建电子表格
        spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

        # 设置工作表范围
        sheetRange = None

        # 循环遍历所有工作表
       for worksheetIndex in range(collectionCount):

            # 使用其索引获取工作表
            worksheet = collection.get(worksheetIndex)

            # 设置工作表范围
            if(worksheetIndex==0):
                sheetRange= "{0}!A:Y".format(firstSheetName)
            else:
                add_sheet(service, spreadsheetID, worksheet.getName())
                sheetRange= "{0}!A:Y".format(worksheet.getName())

            # 获取行数和列数
            rows = worksheet.getCells().getMaxDataRow()
            cols = worksheet.getCells().getMaxDataColumn()

            # 存储工作表数据的列表
            worksheetDatalist = []

            # 循环遍历行
           for i in range(rows):
                # 将每一行存储在工作表中的列表 
                rowDataList = []

                # 循环遍历选定行中的每一列
               for j in range(cols):
                    cellValue = worksheet.getCells().get(i, j).getValue()
                    if( cellValue is not None):
                        rowDataList.append(str(cellValue))
                    else:
                        rowDataList.append("")

                # 添加到工作表数据
                worksheetDatalist.append(rowDataList)

            # 设定值
            body = {
                'values': worksheetDatalist
            }
            
            # 执行请求
            result = service.spreadsheets().values().update(
                spreadsheetId=spreadsheetID, range=sheetRange,
                valueInputOption='USER_ENTERED', body=body).execute()

            # 打印更新单元格的数量    
            print('{0} cells updated.'.format(result.get('updatedCells')))
    except HttpError as err:
        print(err)

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

完整的源代码

以下是用 Python 将 Excel XLSX 文件导出到 Google 表格的完整源代码。

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):
    # 如果修改这些范围,请删除文件 token.json。
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

    creds = None
    # 文件 token.json 存储用户的访问和刷新令牌,并且是
    # 当授权流程第一次完成时自动创建
    # 时间。
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    # 如果没有(有效)凭据可用,则让用户登录。
    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)
        # 保存凭据以供下次运行
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)
        
        # 加载 Excel 工作簿
        wb = Workbook(fileName)

        # 获取工作表集合
        collection = wb.getWorksheets()
        collectionCount = collection.getCount()

        # 获取工作簿和第一张工作表的名称
        spreadsheetName = wb.getFileName()
        firstSheetName = collection.get(0).getName()

        # 在 Google 表格上创建电子表格
        spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

        # 设置工作表范围
        sheetRange = None

        # 循环遍历所有工作表
       for worksheetIndex in range(collectionCount):

            # 使用其索引获取工作表
            worksheet = collection.get(worksheetIndex)

            # 设置工作表范围
            if(worksheetIndex==0):
                sheetRange= "{0}!A:Y".format(firstSheetName)
            else:
                add_sheet(service, spreadsheetID, worksheet.getName())
                sheetRange= "{0}!A:Y".format(worksheet.getName())

            # 获取行数和列数
            rows = worksheet.getCells().getMaxDataRow()
            cols = worksheet.getCells().getMaxDataColumn()

            # 存储工作表数据的列表
            worksheetDatalist = []

            # 循环遍历行
           for i in range(rows):
                # 将每一行存储在工作表中的列表 
                rowDataList = []

                # 循环遍历选定行中的每一列
               for j in range(cols):
                    cellValue = worksheet.getCells().get(i, j).getValue()
                    if( cellValue is not None):
                        rowDataList.append(str(cellValue))
                    else:
                        rowDataList.append("")

                # 添加到工作表数据
                worksheetDatalist.append(rowDataList)

            # 设定值
            body = {
                'values': worksheetDatalist
            }
            
            # 执行请求
            result = service.spreadsheets().values().update(
                spreadsheetId=spreadsheetID, range=sheetRange,
                valueInputOption='USER_ENTERED', body=body).execute()

            # 打印更新单元格的数量    
            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):   
    # 电子表格详细信息
    spreadsheetBody = {
        'properties': {
            'title': "{0}".format(_title)
        },
        'sheets': {
            'properties': {
                'title' : "{0}".format(_sheetName)
            }
        }
    }

    # 创建电子表格
    spreadsheet = _service.spreadsheets().create(body=spreadsheetBody,
                                                fields='spreadsheetId').execute()
    
    # 在网络浏览器中打开
    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)}
            }
        }
    ]}

    # 执行请求
    res = _service.spreadsheets().batchUpdate(spreadsheetId=_spreadsheetID, body=data).execute()

 # 创建一个 Aspose.Cells 香熏对象
license = License()

# 设置 Aspose.Cells 的许可证以避免评估限制
license.setLicense("D:\\Licenses\\Conholdate.Total.Product.Family.lic")

export_to_google("Book1.xlsx")

获得免费的 Aspose.Cells 许可证

您可以获得免费的 临时许可证 并使用 Aspose.Cells for Python,没有评估限制。

结论

在本文中,您学习了如何使用 Python 将 Excel 数据导出到 Google 表格。我们已经介绍了如何在 Google Cloud 上创建项目、启用 Google Sheets API、读取 Excel 文件以及将数据从 Excel 文件导出到 Google Sheets。要了解更多关于 Aspose.Cells for Python 的信息,您可以访问 文档。此外,您可以通过我们的 论坛 提问。

也可以看看