openpyxl iter_rows() 是不是跳过最后一行?

Posted

技术标签:

【中文标题】openpyxl iter_rows() 是不是跳过最后一行?【英文标题】:Is openpyxl iter_rows() skipping last row?openpyxl iter_rows() 是否跳过最后一行? 【发布时间】:2015-02-24 09:20:58 【问题描述】:

我在使用 openpyx iter_rows 时遇到了困难。

源 excel 在第一列 (A) 中有行:

标题 第一个数据行 ... 第 32 行数据

代码:

start, stop = 0, 1000    
for row_index, row in enumerate(source_ws.iter_rows()):
    if start < row_index < stop:                
       # something meaning here

不访问最后的第 32 行数据,而是在第 31 行中断。 行之间没有空行。

我做了一个邪恶的黑客来规避这种行为,但这不是一个持久的选择。

环境:

Python 3.4.0(v3.4.0:04f714765c13,2014 年 3 月 16 日,19:25:23) jdcal==1.0 openpyxl==2.1.5

我在这里做错了什么?

【问题讨论】:

确实需要一个文件来说明,但文件的“尺寸”可能不正确。 这工作:for row_index, row in enumerate(source_ws.iter_rows(), start=1): # something meaning here 所以 openpyxl 工作正常。我知道我做错了 如果取决于你想要做什么。如果您希望 row_index 代表工作表中的一行,那么它需要从 1 开始; Python 使用基于 0 的索引,基于 Excel 1 的索引。 没错。我在我的循环中有一个经典的#2,一个接一个。感谢 Charlie 的 cmets 和帮助! 【参考方案1】:

ws.iter_rows() 将遍历所有行,除非您另有说明。如果你想限制它,那么你可以使用ws.get_squared_range(1, 1, 32, ws.max_column)(前 32 行)。

【讨论】:

【参考方案2】:

对行索引停止条件使用“小于或等于”运算符:

start, stop = 0, 1000    
for row_index, row in enumerate(source_ws.iter_rows()):
    if start < row_index <= stop:                
       # something meaning here

或者您可以使用列表理解和“行”数字属性来删除枚举。请注意,iter_rows() 是从 1 而不是 0 开始计算行数。

    start, stop = 1, 1000    
    for row in [row for row in source_ws.iter_rows() if start < row[0].row <= stop]:
        #do something

【讨论】:

以上是关于openpyxl iter_rows() 是不是跳过最后一行?的主要内容,如果未能解决你的问题,请参考以下文章

《Nuitka打包实战指南》实战打包openpyxl

《Nuitka打包实战指南》实战打包openpyxl

《Nuitka打包实战指南》实战打包openpyxl

openpyxl数据存储

从openpyxl循环行获取单元格数据

使用 openpyxl 移动到相邻单元格