未合并的单元对于循环跳过单元

我使用的是openpyxl,并通过在xlsx工作簿中关于非合并单元的goolging来发现一些代码。

我得到的代码工作,但发现它并没有删除所有合并的细胞在一次通过。 我设置它运行使用while循环,并解决了这个问题,但想知道我做错了,导致首先跳过。 任何见解都会有所帮助。

码:

import openpyxl wb = './filename.xlsx' ws = wb[sheetname] def remove_merged(sheet_object): merged = ws.merged_cell_ranges while len(merged)>0: for mergedRNG in merged: ws.unmerge_cells(range_string = mergedRNG) merged = ws.merged_cell_ranges return len(merged) remove_merged(ws) 

ws.merged_cell_ranges是可变的,所以你需要小心,它不是直接在任何for循环中使用,因为隐式计数器不会考虑到该属性已被重新计算。 这是Python中常见的陷阱:

 l = list(range(10)) for i in l: print(i) l.pop(0) # anything that affects the structure of the list 

以下是如何避免这一点:

 for rng in ws.merged_cell_ranges[:]: # create a copy of the list ws.unmerge(rng) # remove range from original 

PS。 只是从互联网search复制的东西是不明智的。 有几个网站过时或不必要的复杂的代码。 最好参考文档或在邮件列表上询问。