腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
标签
openpyxl
#
openpyxl
关注
专栏文章
(33)
技术视频
(0)
互动问答
(2)
openpyxl 把多个结构相同的 sheet 合并到一个 sheet,怎么保留各自的原格式?
1
回答
python
、
数据处理
、
excel
、
openpyxl
、
pandas
用户12599537
结论 openpyxl 复制单元格时只搬 value,不搬 style。要做到"合并且保格式",需要: 用 copy() 把源单元格的 font / fill / border / alignment / number_format / protection 逐个复制到目标单元格; 列宽用 column_dimensions[字母].width 单独同步(通常取第一个 sheet 的即可); 除第一个 sheet 外,后续 sheet 跳过表头行,避免重复表头。 示例代码 from openpyxl import load_workbook from openpyxl.utils import get_column_letter 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) src_path = "data.xlsx" wb = load_workbook(src_path) sheet_names = ["Jan", "Feb", "Mar"] first = wb[sheet_names[0]] target = wb.create_sheet("All") # sync column widths from the first sheet for col in range(1, first.max_column + 1): letter = get_column_letter(col) target.column_dimensions[letter].width = first.column_dimensions[letter].width start_row = 1 for idx, name in enumerate(sheet_names): ws = wb[name] for r, row in enumerate(ws.iter_rows(), start=1): # skip header row on sheets after the first if idx > 0 and r == 1: continue for c, cell in enumerate(row, start=1): dst = target.cell(row=start_row, column=c) dst.value = cell.value copy_style(cell, dst) start_row += 1 wb.save("merged.xlsx") 关键点说明 copy(cell.font) 必须深拷贝,直接 dst.font = src.font 会让多个单元格共享同一个 style 对象,改一个全变。 数字格式(如会计格式、百分比、日期)靠 number_format 同步,否则合并后数字变成"裸数字"。 公式:openpyxl 写文件时只保存公式字符串,不重算。要保证合并后有值,建议源文件先手动打开保存一次(写入缓存值),或用 data_only=True 读取值再写入。 合并单元格(merged cells):上面的逐单元格复制不会自动处理跨行跨列合并,若源表有合并表头,需额外用 target.merge_cells() 重建,并只对左上角单元格赋值。 小结 "合并 + 保格式"一句话诀:值用 value 搬,格式用 copy() 逐个属性搬,列宽单独搬。结构相同的月表/分表汇总,套上面这段代码即可。...
展开详请
赞
0
收藏
0
评论
0
分享
结论 openpyxl 复制单元格时只搬 value,不搬 style。要做到"合并且保格式",需要: 用 copy() 把源单元格的 font / fill / border / alignment / number_format / protection 逐个复制到目标单元格; 列宽用 column_dimensions[字母].width 单独同步(通常取第一个 sheet 的即可); 除第一个 sheet 外,后续 sheet 跳过表头行,避免重复表头。 示例代码 from openpyxl import load_workbook from openpyxl.utils import get_column_letter 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) src_path = "data.xlsx" wb = load_workbook(src_path) sheet_names = ["Jan", "Feb", "Mar"] first = wb[sheet_names[0]] target = wb.create_sheet("All") # sync column widths from the first sheet for col in range(1, first.max_column + 1): letter = get_column_letter(col) target.column_dimensions[letter].width = first.column_dimensions[letter].width start_row = 1 for idx, name in enumerate(sheet_names): ws = wb[name] for r, row in enumerate(ws.iter_rows(), start=1): # skip header row on sheets after the first if idx > 0 and r == 1: continue for c, cell in enumerate(row, start=1): dst = target.cell(row=start_row, column=c) dst.value = cell.value copy_style(cell, dst) start_row += 1 wb.save("merged.xlsx") 关键点说明 copy(cell.font) 必须深拷贝,直接 dst.font = src.font 会让多个单元格共享同一个 style 对象,改一个全变。 数字格式(如会计格式、百分比、日期)靠 number_format 同步,否则合并后数字变成"裸数字"。 公式:openpyxl 写文件时只保存公式字符串,不重算。要保证合并后有值,建议源文件先手动打开保存一次(写入缓存值),或用 data_only=True 读取值再写入。 合并单元格(merged cells):上面的逐单元格复制不会自动处理跨行跨列合并,若源表有合并表头,需额外用 target.merge_cells() 重建,并只对左上角单元格赋值。 小结 "合并 + 保格式"一句话诀:值用 value 搬,格式用 copy() 逐个属性搬,列宽单独搬。结构相同的月表/分表汇总,套上面这段代码即可。
openpyxl 写几十万行到 Excel 很慢还内存爆,怎么分页或流式写入?
0
回答
python
、
数据处理
、
excel
、
openpyxl
、
分页
热门
专栏
Python小屋
968 文章
147 订阅
python3
11.9K 文章
244 订阅
Python爬虫与数据挖掘
861 文章
62 订阅
TalkPython
120 文章
40 订阅
领券