原文链接:http://www.juzicode.com/python-example-openpyxl-access-data
本文介绍openpyxl模块几种读写单元格的方法,先手动创建一个表格,在代码里先用load_workbook()方法读取这个表格生成一个Workbook对象wb,再通过wb得到一个Worksheet实例ws,然后在ws的基础上访问单元格。
1)iter_rows()和iter_cols()方法
openpyxl支持整行或者整列的读出,这需要用到Worksheet的iter_rows()和iter_cols()方法:
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx') # 第1步访问文件
ws = wb['软件'] # 第2步访问工作表
print('多行访问:')
for row in ws.iter_rows(): # 迭代读出print(row)
print('多列访问:')
for col in ws.iter_cols(): # 迭代读出print(col)
运行结果:
多行访问:
(<Cell '软件'.A1>, <Cell '软件'.B1>, <Cell '软件'.C1>, <Cell '软件'.D1>, <Cell '软件'.E1>)
(<Cell '软件'.A2>, <Cell '软件'.B2>, <Cell '软件'.C2>, <Cell '软件'.D2>, <Cell '软件'.E2>)
(<Cell '软件'.A3>, <Cell '软件'.B3>, <Cell '软件'.C3>, <Cell '软件'.D3>, <Cell '软件'.E3>)
多列访问:
(<Cell '软件'.A1>, <Cell '软件'.A2>, <Cell '软件'.A3>)
(<Cell '软件'.B1>, <Cell '软件'.B2>, <Cell '软件'.B3>)
(<Cell '软件'.C1>, <Cell '软件'.C2>, <Cell '软件'.C3>)
(<Cell '软件'.D1>, <Cell '软件'.D2>, <Cell '软件'.D3>)
(<Cell '软件'.E1>, <Cell '软件'.E2>, <Cell '软件'.E3>)
这种方法获取到的是单元格实例,还可以进一步地通过访问Cell对象的value属性获取到单元格的内容:
for row in ws.iter_rows(): # 迭代读出for r in row:print(r.value)
如果不想返回单元格实例而是返回单元格的值,也可以在调用Worksheet的iter_rows()和iter_cols()方法时传入入参values_only=True,就能直接得到单元格的值:
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx') # 第1步访问文件
ws = wb['软件'] # 第2步访问工作表
print('多行访问:')
for row in ws.iter_rows(values_only=True): # 迭代读出print(row)
print('多列访问:')
for col in ws.iter_cols(values_only=True): # 迭代读出print(col)
运行结果:
多行访问:
('name', 'job', 'company', 'sex', 'contact')
('桔子菌', '软件捉虫工', '桔子code有限公司', 'M', 'VX公众号:juzicode')
('何橙子', '软件布虫工', '桔子code有限公司', 'F', 'www.juzicode.com')
多列访问:
('name', '桔子菌', '何橙子')
('job', '软件捉虫工', '软件布虫工')
('company', '桔子code有限公司', '桔子code有限公司')
('sex', 'M', 'F')
('contact', 'VX公众号:juzicode', 'www.juzicode.com')
当然你还可以在调用iter_rows()和iter_cols()方法时填写min_row,max_row等参数指定访问表格的范围,范围限定在这些指定值的闭区间。
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx') # 第1步访问文件
ws = wb['汇总'] # 第2步访问工作表
print('多行访问:')
for row in ws.iter_rows(values_only=True, min_row=1, max_row=3, min_col=2, max_col=5): # 迭代读出print(row)
运行结果:
多行访问:
('job', 'company', 'sex', 'contact')
('软件捉虫工', '桔子code有限公司', 'M', 'VX公众号:juzicode')
('软件布虫工', '桔子code有限公司', 'F', 'www.juzicode.com')
2)下标方式访问多行多列
上面这个例子通过min_row=1, max_row=3, min_col=2, max_col=5限定了访问范围,返回了第1~3行,第2~5列单元格的内容。这时还可以通过指定单元格的名称来限定访问范围,达到同样的目的,仍然是第1~3行,第2~5列,则可以用[‘B1′:’E3’]表示,其中列号用字母,行号用数字组合起来表示。
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx') # 第1步访问文件
ws = wb['汇总'] # 第2步访问工作表
print('多行多列访问:')
cell_range = ws['B1':'E3'] # 下标方式指定行列的范围
#print('cell_range:',cell_range)
for cells in cell_range: # cells为多个同一行的cell组成的tupleprint(cells)for c in cells: # 单个访问cellprint(c,c.value)
运行结果:
多行多列访问:
(<Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>)
<Cell '汇总'.B1> job
<Cell '汇总'.C1> company
<Cell '汇总'.D1> sex
<Cell '汇总'.E1> contact
(<Cell '汇总'.B2>, <Cell '汇总'.C2>, <Cell '汇总'.D2>, <Cell '汇总'.E2>)
<Cell '汇总'.B2> 软件捉虫工
<Cell '汇总'.C2> 桔子code有限公司
<Cell '汇总'.D2> M
<Cell '汇总'.E2> VX公众号:juzicode
(<Cell '汇总'.B3>, <Cell '汇总'.C3>, <Cell '汇总'.D3>, <Cell '汇总'.E3>)
<Cell '汇总'.B3> 软件布虫工
<Cell '汇总'.C3> 桔子code有限公司
<Cell '汇总'.D3> F
<Cell '汇总'.E3> www.juzicode.com
3)下标方式访问整行整列
还可以通过Worksheet实例的下标方式访问多行多列。如果下标为整型数值对应访问行,如果下标为字符串型数值则对应访问列。如果要得到多行多列的Cell实例可以通过冒号间隔下标,这点和numpy数据下标访问方法类似。比如下面的例子中ws[1]表示第一行的cell,ws[1:3]表示第1-3行cell:
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')
ws = wb['汇总']
print(ws[1]) # 第1行的cell
print(ws['A']) # 第A列的cellprint(ws[1:3]) # 第1-3行cell
print(ws['A':'C']) # 第A-C列cell
运行结果:
(<Cell '汇总'.A1>, <Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>)
(<Cell '汇总'.A1>, <Cell '汇总'.A2>, <Cell '汇总'.A3>, <Cell '汇总'.A4>, <Cell '汇总'.A5>, <Cell '汇总'.A6>)
((<Cell '汇总'.A1>, <Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>), (<Cell '汇总'.A2>, <Cell '汇总'.B2>, <Cell '汇总'.C2>, <Cell '汇总'.D2>, <Cell '汇总'.E2>), (<Cell '汇总'.A3>, <Cell '汇总'.B3>, <Cell '汇总'.C3>, <Cell '汇总'.D3>, <Cell '汇总'.E3>))
((<Cell '汇总'.A1>, <Cell '汇总'.A2>, <Cell '汇总'.A3>, <Cell '汇总'.A4>, <Cell '汇总'.A5>, <Cell '汇总'.A6>), (<Cell '汇总'.B1>, <Cell '汇总'.B2>, <Cell '汇总'.B3>, <Cell '汇总'.B4>, <Cell '汇总'.B5>, <Cell '汇总'.B6>), (<Cell '汇总'.C1>, <Cell '汇总'.C2>, <Cell '汇总'.C3>, <Cell '汇总'.C4>, <Cell '汇总'.C5>, <Cell '汇总'.C6>))
注意这种方式和前面通过下标方式访问多行多列有所区别,这种方式只能得到整行或整列的cell,并不能得到一个“矩形”状的多行多列cell。
4) Worksheet的vaules属性
还可以通过Worksheet的vaules属性直接得到单元格的值:
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')
ws = wb['汇总']
print(ws.values)
for value in ws.values:print(value)
运行结果:
<generator object Worksheet.values at 0x000001F3F9167A70>
('name', 'job', 'company', 'sex', 'contact')
('桔子菌', '软件捉虫工', '桔子code有限公司', 'M', 'VX公众号:juzicode')
('何橙子', '软件布虫工', '桔子code有限公司', 'F', 'www.juzicode.com')
('柚子菌', '硬件抠图工', '桔子code有限公司', 'F', 'VX公众号:桔子code')
('王金桔', '焊工', '橙子加工工厂', 'M', 'VX公众号:桔子code')
('赵沃柑', '维修工', '桔子电子信息有限公司', 'F', '1008611')
5) Worksheet的rows,colnums属性
也可以通Worksheet的rows,colnums属性访问单元格,他们会返回单元格对象生成器,通过for循环能得到单元格Cell对象:
#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')
ws = wb['汇总']
print(ws.rows)
for row in ws.rows:print(row)#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')
ws = wb['汇总']
print(ws.columns)
for col in ws.columns:print(col)
运行结果:
<generator object Worksheet._cells_by_row at 0x00000214C7FF7990>
(<Cell '汇总'.A1>, <Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>)
(<Cell '汇总'.A2>, <Cell '汇总'.B2>, <Cell '汇总'.C2>, <Cell '汇总'.D2>, <Cell '汇总'.E2>)
(<Cell '汇总'.A3>, <Cell '汇总'.B3>, <Cell '汇总'.C3>, <Cell '汇总'.D3>, <Cell '汇总'.E3>)
(<Cell '汇总'.A4>, <Cell '汇总'.B4>, <Cell '汇总'.C4>, <Cell '汇总'.D4>, <Cell '汇总'.E4>)
(<Cell '汇总'.A5>, <Cell '汇总'.B5>, <Cell '汇总'.C5>, <Cell '汇总'.D5>, <Cell '汇总'.E5>)
(<Cell '汇总'.A6>, <Cell '汇总'.B6>, <Cell '汇总'.C6>, <Cell '汇总'.D6>, <Cell '汇总'.E6>)<generator object Worksheet._cells_by_col at 0x00000214C7FF7A00>
(<Cell '汇总'.A1>, <Cell '汇总'.A2>, <Cell '汇总'.A3>, <Cell '汇总'.A4>, <Cell '汇总'.A5>, <Cell '汇总'.A6>)
(<Cell '汇总'.B1>, <Cell '汇总'.B2>, <Cell '汇总'.B3>, <Cell '汇总'.B4>, <Cell '汇总'.B5>, <Cell '汇总'.B6>)
(<Cell '汇总'.C1>, <Cell '汇总'.C2>, <Cell '汇总'.C3>, <Cell '汇总'.C4>, <Cell '汇总'.C5>, <Cell '汇总'.C6>)
(<Cell '汇总'.D1>, <Cell '汇总'.D2>, <Cell '汇总'.D3>, <Cell '汇总'.D4>, <Cell '汇总'.D5>, <Cell '汇总'.D6>)
(<Cell '汇总'.E1>, <Cell '汇总'.E2>, <Cell '汇总'.E3>, <Cell '汇总'.E4>, <Cell '汇总'.E5>, <Cell '汇总'.E6>)
更多应用实例公众号【桔子code】后台回复【openpyxl】获取下载链接。
扩展阅读:
- Python轮子:Excel读写利器——openpyxl – 桔子code (juzicode.com)