xlwings 浏览器

此功能需要 xlwings PRO 和至少 v0.28.0 版本。

xlwings PRO 配备了一个超快速的 Excel 文件读取器。相比而言,pandas.read_excel(),当你读取单个工作表时,你应该能够看到 5 到 25 倍之间的加速。确切的速度将取决于你的内容、文件格式和 Python 版本。以下是支持的 Excel 文件格式:

  • xlsx / xlsm / xlam

  • xlsb

  • xls

其他优点包括:

  • 支持命名区域。

  • 支持通过myrange.expand()myrange.options(expand="table")分别实现的动态区域。

  • 支持转换器,因此你可以不仅以 pandas DataFrame 的形式读取区域,还可以将其作为 NumPy 数组、列表、标量值、字典等读取。

  • 你可以像字符串一样读取单元格错误,#DIV/0!#N/A而不是将它们全部转换为NaN

  • 各种文件格式均支持日期时间转换,包括xlsb.

与经典的(“交互式”)需要安装 Excel 的 xlwings 使用方式不同,读取文件不依赖于 Excel 的安装,因此可以在 Python 运行的任何地方使用。然而,直接从文件读取要求工作簿在 xlwings 能够获取任何更改之前保存。

读取特定范围

若要以读取模式打开文件,请提供mode="r"参数:xw.Book("myfile.xlsx", mode="r")。通常建议将Book用作上下文管理器,以便代码离开with语句体后文件能自动关闭并清理资源:

import xlwings as xw

with xw.Book("myfile.xlsx", mode="r") as book:
    sheet1 = book.sheets[0]
    data = sheet1["A1:B2"].value

如果你不使用with语句,请确保手动通过book.close().

读取整个工作表

若要读取整个工作表,请使用cells属性访问底层对象:

with xw.Book("myfile.xlsx", mode="r") as book:
    sheet1 = book.sheets[0]
    data = sheet1.cells.value

转换器:数据帧等

你可以使用常规的转换器,例如以 DataFrame 的形式读取一个区域:

with xw.Book("myfile.xlsx", mode="r") as book:
    sheet1 = book.sheets[0]
    df = sheet1["A1:B2"].options("df").value
    # As usual, you can also provide more options
    df = sheet1["A1:B2"].options("df", index=False).value

更多详情,请参阅转换器和选项.

命名区域

可以这样访问命名区域:

with xw.Book("myfile.xlsx", mode="r") as book:
    sheet1 = book.sheets[0]
    data = sheet1["myname"].value  # get values
    address = sheet1["myname"].address  # get address

或者,你也可以通过Names集合访问它们:

with xw.Book("myfile.xlsx", mode="r") as book:
    for name in book.names:
        print(name.refers_to_range.value)

动态区域

你可以利用常规的区域扩展来读取动态大小的区域:

with xw.Book("myfile.xlsx", mode="r") as book:
    sheet1 = book.sheets[0]
    data = sheet1["A1"].expand().value

单元格错误

尽管 xlwings 默认将单元格错误(如#N/A读取为None,如果你特别查找这些错误,可以通过使用err_to_str选项将其作为字符串读取:

with xw.Book("myfile.xlsx", mode="r") as book:
    sheet1 = book.sheets[0]
    data = sheet1["A1:B2"].option(err_to_str=True).value

限制

  • 当前仅可通过pip install xlwings或通过conda-forgeconda 渠道获得,但尚未在官方 Anaconda 渠道上发布。

  • 动态区域:myrange.expand()当前效率低下,如果动态区域较大,将显著减慢读取速度。

  • 命名区域:目前具有工作表作用域的命名区域无法显示其正确名称。例如,mybook.names[0].name将显示名称mylocalname而不是包含工作表名称的形式Sheet1!mylocalname。类似地,names属性只能通过book对象访问,而不是通过sheet对象访问。其他定义的名称(公式和常量)当前不受支持。

  • Excel 表格:当前还不支持通过表格名称访问数据。

  • 选项:除了err_to_str之外,非默认选项当前效率低下并将减慢读取操作。这包括dates, emptynumbers.

  • 公式:当前仅支持单元格值,而不支持单元格公式。

  • 这只是一个文件读取器,当前不支持写入文件。