如何在Python的openpyxl中为未知行号的表头行填充颜色?
如何用openpyxl为未知行号的表头行填充颜色
你的需求很典型:要给每个数据段开头的表头行上色,但每个数据段的行数是随机的,没法提前预判表头行的具体行号。常规的已知行号再设置填充的方法确实不适用,但我们可以利用openpyxl的一个小特性轻松解决这个问题。
核心思路
每次用ws.append()添加表头行之后,工作表的max_row属性会立刻更新为刚添加的这一行的行号。所以我们只需要在append表头行之后立刻获取这个行号,就能精准定位到要上色的行,完全不需要提前知道行号。
修改后的完整代码
from openpyxl import Workbook from openpyxl.styles import PatternFill import random wb = Workbook() ws = wb.active # 提前定义填充样式,避免循环里重复创建对象 fill = PatternFill("solid", fgColor="DDDDDD") for section in range(10): header_row = ('col1', 'col2') ws.append(header_row) # 关键步骤:append后,max_row就是当前表头行的行号 current_header_row = ws.max_row # 给该行所有单元格设置填充样式 for cell in ws[current_header_row]: cell.fill = fill # 生成并添加随机数量的数据行 random_amount_rows = [('bar', 'foo') for i in range(1, random.randrange(2,10))] for datarow in random_amount_rows: ws.append(datarow) # 记得保存工作簿 wb.save("formatted_workbook.xlsx")
细节说明
- 把
PatternFill定义在循环外,避免每次循环都创建新的样式对象,小数据量看不出来,数据多的时候能提升不少效率。 - 用
ws[current_header_row]直接获取目标行的所有单元格,比list(ws.rows)[rownumber]更直观,而且后者会一次性加载所有行,数据量大时内存占用更高。 - 因为是在append表头行之后立刻获取行号,不管后续数据行有多少,都能精准命中当前的表头行,完全不受动态行数的影响。
和常规场景的对比
常规已知行号的场景你会这么写:
fill = PatternFill("solid", fgColor="DDDDDD") for cell in list(ws.rows)[rownumber]: cell.fill = fill
但这种方法依赖固定的rownumber,在你的动态场景中,我们通过append后立即捕获行号的方式,完美绕开了“提前知道行号”的限制。
内容的提问来源于stack exchange,提问作者bl79
相关产品推荐
相关产品推荐

