用openpyxl遍历表格的行列

2020年7月9日 / 12,993次阅读 / Last Modified 2020年7月14日
excel表格

本文汇总一下用openpyxl模块操作excel表格行列的技巧,始终记得:行的编号从1开始,列的标号从A开始。

查看整个sheet的dimensions:

>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename='GM2020040102.xlsx')
>>> wb.sheetnames
['production', 'Sheet2', 'Sheet3']
>>> ws = wb['production']
>>> ws.dimensions
'A1:J3'

最简单粗暴的遍历方法就是这样:

>>> data = tuple(ws)
>>>
>>> for i in range(3):
...   for j in range(7):
...     print(data[i][j].value)
...
name
type
quantity
sn_start
sn_end
hardv
softv
产品名称
产品型号
数量
序列号start
序列号end
实际硬件版本
实际软件版本
10G SFP+ LR收发合一光模块
P2L
101
123456000
123456999
P2L_V2.0
P2L_1_00_011.hex

上面的循环,i对应行,1-3,j对应列,A-J。

通过ws.rows可以更好地按行遍历:

>>> for row in ws.rows:
...   print(row)

同样用ws.columns做按列遍历:

>>> for col in ws.columns:
...   print(col)

遍历单行:

>>> for hang2 in ws[2]:
...   print(hang2.value)
...
产品名称
产品型号
数量
序列号start
序列号end
实际硬件版本
实际软件版本
对外硬件版本号
对外软件版本号
备注说明

遍历多行:

>>> for hi in ws[1:3]:
...   for it in hi:
...     print(it.value)
...

ws[1:3]就是第1行到第3行。

遍历单列:

>>> for col in ws['A']:
...   print(col.value)
...
name
产品名称
10G SFP+ LR收发合一光模块

这是直接遍历A列。

遍历多列:

>>> for cols in ws['A:C']:
...   for j in cols:
...     print(j.value)
...

取一个区域进行遍历,使用iter_rows或者iter_cols函数,假设我们有如下一个表格:

测试用表格
测试用表格
>>> wb2 = load_workbook(filename='saved.xlsx')
>>> wb2.sheetnames
['Sheet']
>>> ws2 = wb2['Sheet']
>>>
>>> ws2.dimensions
'B4:D6'
>>>
>>> for row in ws2.iter_rows(min_row=4,max_row=5,min_col=2,max_col=3):
...   for i in row:
...     print(i.value)
...
1
2
4
5
>>>
>>> for col in ws2.iter_cols(min_row=4,max_row=5,min_col=2,max_col=3):
...   for j in col:
...     print(j.value)
...
1
4
2
5

iter_rows是行优先,而iter_cols是列优先。此时列也要用数字来表示,A就是1。

-- EOF --

本文链接:https://www.pynote.net/archives/2219

留言区

《用openpyxl遍历表格的行列》有5条留言

您的电子邮箱地址不会被公开。 必填项已用*标注

  • 麦新杰

    注意ws.dimensions与ws.max_row,ws.max_column的区别:

    >>> wb = load_workbook(filename='saved.xlsx')
    >>> wb.sheetnames
    ['Sheet']
    >>> ws = wb.active
    >>> ws.title
    'Sheet'
    >>> ws.dimensions
    'B4:D6'
    >>> ws.max_row
    6
    >>> ws.max_column
    4
     [回复]

  • 麦新杰

    ws.rows是个generator [回复]

    • 麦新杰

      
              init_seq = None
              rows = ws.rows
              next(rows)
              try:
                  while True:
                      row = next(rows)
                      seq = row[0].value
                      if init_seq is None:
                          init_seq = seq
                          wlog.log('GM'+seq[:10])
                      if seq[:10] != init_seq[:10]:
                          wlog.error('seq is not consistent...'+seq)
                          return
                      else:
                          wlog.log(seq)
              except StopIteration:
                  pass
       [回复]

  • 麦新杰

    还有直接取某一行或某一列的对象的方法:

    # 调整列宽
    ws.column_dimensions['A'].width = 20.0
    # 调整行高
    ws.row_dimensions[1].height = 40
     [回复]

    • 麦新杰

      用这个方法可以设置列的宽和行的高。 [回复]


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top