Python实例:openpyxl读写单元格

原文链接: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组成的tuple
    print(cells)
    for c in cells:       # 单个访问cell
        print(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列的cell

print(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】获取下载链接。

扩展阅读:

  1. Python轮子:Excel读写利器——openpyxl – 桔子code (juzicode.com)
  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值