答紫风
openpyxl 复制单元格时默认只搬 value 不搬 style,所以格式全丢。核心办法是用 copy() 逐个属性搬。
关键代码:
from copy import copy
def copy_style(src, dst):
dst.font = copy(src.font)
dst.fill = copy(src.fill)
dst.border = copy(src.border)
dst.alignment = copy(src.alignment)
dst.number_format = src.number_format
dst.protection = copy(src.protection)
然后遍历每个 sheet 的每个单元格,把 value 和 style 分别写到目标 sheet。有几个坑要注意:
copy(src.font) 必须深拷贝,直接赋值会让多个单元格共享同一个 style 对象,改一个全变。
列宽不会跟着单元格走,需要用 target.column_dimensions[letter].width 单独同步,通常取第一个 sheet 的就行。
数字格式靠 number_format 同步,否则百分比、日期、会计格式全变成裸数字。
合并单元格(merged cells)不会自动搬,如果源表有跨行跨列的合并表头,需要额外用 target.merge_cells() 重建。
公式的话 openpyxl 只存字符串不重算,建议源文件先用 data_only=True 读值再写。