用 Python 这样处理 Excel 很简单

Jan 19 2020

Python 中的 xlwings 库用来处理 Excel 非常好用,支持高版本的 xlsx 格式,也能支持 pandas 的 DataFrame,甚至还提供 REST API。用法上也简洁明了,下面说一说一些基本的读和写的操作

安装

1
pip install xlwings

在 conda 上安装,由于直接 install 的话,官方的包会滞后,所以采用下面的命令会接近于 pip 的发布

1
conda install -c conda-forge xlwings

Windows 系统上还需要依赖 pywin32, comtypes 库,但 pip 和 conda 安装时会自动处理

读 Excel

xlwings 的一套逻辑关系是
App -> workbook(工作簿,我们打开的 Excel 文件)-> sheet(工作簿中的某一个编辑页)

所以创建的先后顺序也是先创建 App,再打开 workbook,再指定要读取的 sheet

1
2
3
4
5
6
7
# 推荐这样导入包
import xlwings as xw

# 创建 App,设置为不可见,代码处理时不希望看到界面被打开
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = False

打开 workbook,这里要指定 xls 或者 xlsx 的文件路径

1
2
excel_path = 'xxx.xlsx'
workbook = app.books.open(excel_path)

遍历 sheet 的方式很简单,用 for 即可

1
2
3
4
5
for sheet in workbook.sheets:
print('sheet name is{}'.format(sheet.name))

fori i in range(len(workbook.sheets)):
print('sheet name is{}'.format(workbook.sheets[i]))

还可以指定 sheet 的名字针对性的访问

1
2
sheet_name = 'test_excel'
sheet = workbook.sheets[sheet_name]

接下来,是访问 sheet 内具体的数据,在 xlwings 里使用 Range。按行访问时,第一行的下标是 1 不是 0,这跟编程语言的习惯不一样

1
2
3
4
index = 1
_value_A1 = sheet.range('A' + str(index)).value

_value_B2 = sheet.range('B2').value

循环的遍历某一列

1
2
for index in range(1, 10):
sheet.range('A' + str(index)).value

读取一个区域的数据

1
2
3
4
5
6
values = sheet.range('A1:C3').value

# 输出这个区域的矩阵 list
[['Pos', 'Name', 'Ct SYBR'],
['A1', '6A1-IL10', 21.9],
['A2', '6A1-IL10', 21.99]]

如果是空的单元格,返回的 value=None

没有关闭工作簿时,手动打开这个表格会提示已经锁定了

undefined

所以及时关闭,最好在使用的块外用 try-finally 保证每次都会关闭

1
2
3
4
5
try:
# do-something-here
finally:
workbook.close()
app.quit()

写 Excel

写数据的基本操作主要涉及创建 workbook,sheet,添加数据,保存数据。当初始化 App 实例后,通过 add 方式来新建工作簿

1
new_workbook = app.books.add()

此时创建的工作簿默认带名字为 Sheet1 的 sheet,修改名字通过以下方式

1
2
3
4
5
6
# 通过访问序号的方式改名
new_sheet_name = 'new_sheet'
new_workbook.sheets[0].name = new_sheet_name

# 通过访问名字的方式改名
new_workbook.sheets['Sheet1'].name = new_sheet_name

添加新的 sheet

1
2
3
4
5
6
# 添加默认名字的 sheet
new_workbook.sheets.add()

# 添加指定名字的 sheet
a_name = 'a_name'
new_workbook.sheets.add(a_name)

修改数据,直接对 value 赋值

1
2
3
# 修改 value 的值
index = 1
sheet.range('A' + str(index)).value = 'new_value'

保存新的工作簿

1
2
3
4
5
_path = 'xxxxx.xlsx'
new_workbook.save(_path)

# 不添加路径的 save,类似于 ctrl + S
new_workbook.save()

除此之外,xlwings 还可以把 plt 画的图粘贴到表格中

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot([1, 2, 3])

sheet = workbook.sheets[0]
sheet.pictures.add(fig, name='plot', update=True)
workbook.save('picture.xlsx')

打开 picture.xlsx

undefined

今天分享了 xlwings 库在 Python 中处理 Excel 的基本操作,实现数据的读写掌握上面的内容基本足够了,我根据上面的内容,实现了一个处理数据的需求交付业务测试使用,更多 API 和功能的使用方法建议查询官网,网上很多博客写的东西太简单,写得也不怎么样