在之前的办公自动化系列文章中,我已经对Python操作Excel的几个常用库openpyxl、xlrd/xlwt、xlwings、xlsxwriter等进行了详细的讲解。
为了进一步带大家了解各个库的异同,从而在不同场景下可以灵活使用,本文将横向比较7个可以操作 Excel 文件的常用模块,在比较各模块常用操作的同时进行巩固学习!
首先让我们来整体把握下不同库的特点“xlrd、xlwt、xlutils 各自的功能都有局限性,但三者互为补充,覆盖了Excel文件尤其是 .xls 文件的操作。xlwt 可以生成 .xls 文件,xlrd 可以读取已经存在的 .xls 文件,xlutils 连接 xlrd 和 xlwt 两个模块,使用户可以同时读写一个 .xls 文件。简单来说,xlrd 负责读、xlwt 负责写、xlutils 负责提供辅助和衔接
xlwings 能够非常方便的读写 Excel 文件中的数据,并且能够进行单元格格式的修改
XlsxWriter 是一个用来写 .xlsx 文件格式的模块。它可以用来写文本、数字、公式并支持单元格格式化、图片、图表、文档配置、自动过滤等特性。但不能用来读取和修改 Excel 文件
openpyxl 通过 工作簿 “workbook - 工作表 sheet - 单元格 cell” 的模式对 .xlsx 文件进行读、写、改,并且可以调整样式
pandas 大家都不陌生,是进行数据处理和分析的强大模块,有时也可以用来自动化处理Excel”
如果你懒得看详细的对比过程,可以直接看最后的总结图,然后拉到文末收藏点赞就算学会了
一、安装
7个模块均为pip 进行安装:pip install xlrd
pip install xlwt
pip install xlutils
pip install xlwings
pip install XlsxWriter
pip install openpyxl
pip install pandas
二、模块导入
多数模块可以直接通过名字导入,有些模块约定俗称会使用缩写:import xlrd
import xlwt
import xlwings as xw
import xlsxwriter
import openpyxl
import pandas as pd
xlutils 模块是 xlrd 和 xlwt 之间的桥梁,最核心的作用是拷贝一份通过 xlrd 读取到内存中的 .xls 对象,然后再拷贝对象上通过 xlwt 修改 .xls 表格的内容。xlutils 可以将 xlrd 的 Book 对象复制转换为 xlwt 的Workbook 对象,具体使用时通常导入的是模块中的 copy 子模块:import xlutils.copy
三、读取 Excel 文件
3.1 获取文件
并不是所有7个模块都可以读取 Excel 文件,而即使能读取Excel文件也要分不同后缀名进行讨论,具体如下:“xlwt、xlutils、XlsxWriter 不能读取文件
xlrd 可以读取 .xls 和 .xlsx 文件
xlwings 可以读取 .xls 和 .xlsx 文件
openpyxl 可以读取 .xlsx 文件
pandas 可以读取 .xls 和 .xlsx 文件”
下面使用两个大小均为 10MB 的 .xls 和 .xlsx 文件进行测试:xls_path = r'C:\xxx\Desktop\test.xls'
xlsx_path = r'C:\xxx\Desktop\test.xlsx'
3.1.1 xlrd 读取文件
xlrd 可以读取 .xls 和 .xlsx 文件xls = xlrd.open_workbook(xls_path)
xlsx = xlrd.open_workbook(xlsx_path)
3.1.2 xlwings 读取文件
xlwings 直接对接的是 apps,也就是 Excel 应用程序,然后才是工作簿 books 和工作表 sheets,xlwings 需要安装有 Excel 应用程序的环境xlwings 可以读取 .xls 和 .xlsx 文件app = xw.App(visible=True, add_book=False) # 程序可见,只打开不新建工作薄
app.display_alerts = False # 警告关闭
app.screen_updating = False # 屏幕更新关闭
# wb = app.books.open(xls_path)
wb = app.books.open(xlsx_path)
wb.save() # 保存文件
wb.close() # 关闭文件
app.quit() # 关闭程序
3.1.3 openpyxl 读取文件
openpyxl 可以读取 .xlsx 文件wb = openpyxl.load_workbook(xlsx_path)
如果读取 .xls 文件会报错:wb = openpyxl.load_workbook(xls_path)
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
3.1.4 pandas 读取文件
pandas 可以读取 .xls 和 .xlsx 文件xls = pd.read_excel(xls_path, sheet_name='Sheet1')
xlsx = pd.read_excel(xlsx_path, sheet_name='Sheet1')
接下来比较四个模块在同一配置电脑下读取 10MB .xlsx 文件的时间(运行3次求平均值),所用代码为:import time
import xxx
time_start = time.time()
xxx
time_end = time.time()
print('time cost: ', time_end-time_start, 's')
最后测试的结果是,xlwings 读取 10MB 文件最快,xlrd 次之,openpyxl 最慢(因电脑而异,结果仅供参考)
读入 Excel 文件部分的表格总结如下:
3.2 获取工作表
针对上述4个可以读取 Excel 文件的模块,进一步讨论其获取工作表 sheet 的方式
3.2.1 xlrd 获取工作表
可以通过 sheet 名查找:sheet = xlsx.sheet_by_name("Sheet1")
也可通过索引查找:sheet = xlsx.sheet_by_index(0)
3.2.2 xlwings 获取工作表
xlwings 的工作表分为活动工作表以及指定工作簿下的特定工作表:sheet = xw.sheets.active # 在活动工作簿
sheet = wb.sheets.active # 在特定工作簿
3.2.3 openpyxl 获取工作表
.active 方法默认获取工作簿的第一张工作表sheet = wb.active
另外也可以通过工作表名指定获取工作表:sheet = wb['Sheet1']
3.2.4 pandas 获取工作表
单独获取工作表完全没有 pandas 什么事情,因为读取文件的同时已经且必须指定工作表才能读取:xlsx = pd.read_excel(xlsx_path, sheet_name='Sheet1')
四、创建 Excel 文件
简单总结创建 Excel 文件的情况:“xlrd、xlutils 不能创建 Excel 文件
xlwt 只能创建 .xls 文件,不能创建 .xlsx 文件
xlwings可以创建 .xls 和 .xlsx 文件
XlsxWriter 可以创建 .xlsx 文件
openpyxl 可以创建 .xls 和 .xlsx 文件
pandas 没有创建 Excel 的概念,但可以存储时产生 .xls 或 .xlsx 文件”
4.1 xlwt 创建文件
xlwt 只能创建 .xls 文件,不能创建 .xlsx 文件xls = xlwt.Workbook(encoding= 'ascii')
# 创建新的sheet表
worksheet = xls.add_sheet("Sheet1")
4.2 xlwings 创建文件
xlwings可以创建 .xls 和 .xlsx 文件,只需要最后保存时写清楚后缀即可。使用如下命令:wb = app.books.add()
无论是新建还是打开都需要保存工作簿、关闭工作簿、关闭程序,即: