【问题标题】:Is there a simple way to iterate over a disjoint range of Excel sheet in openpyxl?有没有一种简单的方法来迭代openpyxl中不相交的Excel工作表范围?
【发布时间】:2020-01-22 20:15:53
【问题描述】:

我需要遍历具有'A1', 'O1', 'R1:S1' 结构的不相交范围。 有许多工作簿,并且每个工作簿的相应工作表中有许多行要迭代(例如,“Sheet1”的第 21、24、31:35、40 行)。 有没有一种简单的方法可以使用 openpyxl 或其他库对其进行迭代?

目前我对每一行都使用以下内容,这是不可接受的。

wb = openpyxl.load_workbook(filename)

sheet = wb['Sheet1']
for cellObj in sheet['A1:S2']:
    for cell in cellObj:
        pass

我未能在文档中找到提示。 在这种情况下可能是其他一些库或不同的方法适用吗?

【问题讨论】:

  • 你可以这样做:for row in (21, 24, (31, 35), 40):values = [cell(row=row, column=col).value for col in (A, O, R, S)]
  • @stovfl,我对 'str' 和 'int' 有一些问题。我应该使用一些column_index_from_string 吗?
  • 我应该使用一些column_index_from_string吗?:是的,我的(A, O, R, S)应该是int
  • MultiCellRange 听起来很有用。
  • @CharlieClark,你能详细说明一下吗?

标签: python excel openpyxl


【解决方案1】:

我不相信库中有内置的东西,但你可能会这样做:

wb = openpyxl.load_workbook(filename)
sheet = wb['Sheet1']

rows = [21, 24] + list(range(31, 36) + [40]
cols = ["A", "O", "R", "S"]

for row in rows:
    for col in cols:
        cell = sheet[f"{col}{row}"]

在这种情况下RS 是连续的,所以没有太大问题。如果您有更大的范围,手动编写会很乏味,请查看如何创建 character range 并以与 rows 相同的方式使用它。


正如 stovfl 所指出的,字符串格式化可能更昂贵。由于我们有单元格的行和列,我们可以使用Worksheet.cell 方法进行简单的转换:

from openpyxl.utils.cell import column_index_from_string

...
cols = ["A", "O", "R", "S"]
cols = [column_index_from_string(col) for col in cols]
...
        cell = sheet.cell(row=row, col=col)
  • 当然,如果您首先对cols 使用整数表示法,则无需转换,访问将作为代码的最后一行。

【讨论】:

  • 不要使用sheet["{col}{row}"] 表示法,它很慢。您已经有row,col 直接访问单元格。
  • 感谢@stovfl 确实除了小转换之外可能会更好(因为cell 方法需要整数
  • @garej 不确定我明白你的意思
  • @Tomerikoo,我的意思是,类似于以下错误表达的符号:sheet['A1, R1:S1']
  • @garej sheet['A1, R1:S1']:你可以定义一个函数生成器,例如def disjoint_range('A1, R1:S1'): 根据给定范围生成列索引。但是您不能将其与 sheet[...] 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2010-10-25
  • 1970-01-01
  • 2021-04-05
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多