openpyxl 3.0.7如何实现单元格字体、背景色等全样式跨单元格复制
openpyxl 3.0.7 单元格全样式复制解决方案
报错根因
openpyxl 3.x版本中单元格的样式属性默认由只读StyleProxy对象包装,直接执行sheet["E1"].font = sheet["D1"].font赋值时会触发TypeError: unhashable type: 'StyleProxy'错误。而直接复制.style属性仅能同步命名样式,无法覆盖单元格自定义的独立样式,因此会出现样式复制不全的问题。
实现代码
可直接调用以下通用函数完成全样式复制:
from openpyxl.styles import Font, Border, Alignment, Protection, PatternFill def copy_full_cell_style(source_cell, target_cell): # 复制字体样式 target_cell.font = Font(**vars(source_cell.font)) # 复制填充样式(兼容普通填充、渐变填充等多种类型) target_cell.fill = type(source_cell.fill)(**vars(source_cell.fill)) # 复制边框样式 target_cell.border = Border(**vars(source_cell.border)) # 复制对齐规则 target_cell.alignment = Alignment(**vars(source_cell.alignment)) # 复制数字格式 target_cell.number_format = source_cell.number_format # 复制单元格保护属性 target_cell.protection = Protection(**vars(source_cell.protection))
使用示例
将D1单元格的全量样式复制到E1:
copy_full_cell_style(sheet["D1"], sheet["E1"])
注意事项
- 仅需复制部分样式时,可删除函数内对应不需要的属性赋值行
- 合并单元格仅需对合并区域的左上角单元格执行样式复制即可生效
- 若需同步自定义命名样式,可在函数末尾补充
target_cell.style = source_cell.style一行
内容的提问来源于stack exchange,提问作者Squary94
相关产品推荐
相关产品推荐

