Excel复制到吐血?Python一招教你连合并单元格和格式一起带走

发布时间:2026/7/20 11:29:41
Excel复制到吐血?Python一招教你连合并单元格和格式一起带走 场景工作里, 我们有时会把一个 excel 中的 sheet 复制到一个新的 excel 中, 这要是正使用中的, 通常能轻松达成这点。然而, 一旦碰到有着包含合并单元格的多级表头的 excel, 要来处理就繁杂许多了, 而我们更偏向借助库并结合起来去处理数据。此类时候便会出现一个问题: 你能够发觉, 复制之际, 依照网上那种办法, 一般仅仅会复制数据, 可数据格式以及合并单元格、边框等全都被丢弃不见了, 结果致使复制表格这个操作以失败告终。代码如下import openpyxl # 打开源Excel文件和工作表 source_workbook openpyxl.load_workbook(source.xlsx) source_sheet source_workbook.active # 创建目标Excel文件和工作表 target_workbook openpyxl.Workbook() target_sheet target_workbook.active # 复制数据和格式 for row in source_sheet.iter_rows(values_onlyTrue): target_sheet.append(row)上面所提及的代码, 仅仅是复制了数据, 然而, 却并未复制数据格式, 以及合并单元格这类表格样式。跨工作簿带格式复制分类从工作簿之外带着格式进行复制操作, 总体而言大致可以划分成两类情形: 其一, 直接从文件里读取相关内容, 接着实施复制其二, 已经借助库把数据读取到内存当中, 在经过数据方面的处理之后, 需要将工作表复制到一个全新的电子表格里予以保存。第一类第一种偏简单, 于互联网络之上亦能瞅见好多汇总, 我这儿亦寻觅到其中之一予以举个例子:# 代码1带格式复制一个sheet到另一个sheet from openpyxl import load_workbook import xlwings as xw app xw.App(visibleFalse, add_bookFalse) source_workbook app.books.open(原表.xlsx) target_workbook app.books.open(target.xlsx) sheet_name source_workbook.sheets[汇总] # 要复制的工作表名称 target_worksheet target_workbook.sheets[0] sheet_name.copy(beforetarget_worksheet) target_workbook.save() target_workbook.close() source_workbook.close() app.quit()以下代码能够把一个表格, 其文件名为“原表.xlsx”, 以及 sheet 名为“汇总”, 进行原样复制复制到一个文件名为: “.xlsx”的文件里头, 大家能够自己去测试。第二类然而, 在面临要针对数据展开处理, 接着将带格式的数据复制至另外一个excel文件之际, 第一种情形所给出的代码就显得极为棘手了。不多作言语赘述, 直接呈上案例。如下呈现一幅图, 图中有一个名称为有那么一个名为“.xlsx”这样子工作簿, 它的里面涵盖两个sheet, 这两个sheet各自的名称分别是这些: “汇总”以及“清单”。此刻, 我们期望依据“州名”这一列当中的值, 对.xlsx工作簿给予拆分进而生成若干个全新的工作簿。就以州名“威斯康星州”来当作例子, 所生成的新文件是“威斯康星州.xlsx”。情形如图所示。想做上述操作, 得先把原表.xlsx读取进来, 针对这种含有合并单元格的表来处理, 我觉着自身更拿手。于是呢, 我运用办法把.xlsx读进内存, 先是取出“汇总”表来进行数据处理, 拆分成一个州对应一个文件, 此时就得先暂存于列表之中, 接着再取出“清单”表来做数据处理, 同样保存到一个列表里面, 最终我遍历两个列表, 把一个州的汇总以及清单表放置到一个文件里保存。这会儿使用网上的教程, 要么缺失格式, 要么缺少合并单元格, 要么缺少列宽。我所给出的程序, 能够把原表的全部格式依照原本样子复制至新表, 可以这么说。然而更要重视的是, 对于存有合并单元格的列宽, 程序没办法完完全全拿取到, 部分列的列宽设置了默认数值, 也许不能够全然跟原表保持一致, 像这样的代码如下:def copy_sheet_to_sheet(old_sht, new_sht): for i in range(1,old_sht.max_row1): # 最大行1 for j in range(1, old_sht.max_column1): #最大列1 src_cell old_sht.cell(i, j) # getattr(ws.cell(rowm,columnc)value) new_sht.cell(rowi,columnj).valuesrc_cell.value if src_cell.has_style: #拷贝格式 new_sht.cell(rowi, columnj).font copy(src_cell.font) new_sht.cell(rowi, columnj).border copy(src_cell.border) new_sht.cell(rowi, columnj).fill copy(src_cell.fill) new_sht.cell(rowi, columnj).number_format copy(src_cell.number_format) new_sht.cell(rowi, columnj).protection copy(src_cell.protection) new_sht.cell(rowi, columnj).alignment copy(src_cell.alignment) if old_sht.merged_cells: # 获取合并单元格的边界 print(old_sht.merged_cells) for mergecell in old_sht.merged_cells: print(str(mergecell)) # 在新工作簿中创建合并单元格 new_sht.merge_cells(str(mergecell)) # 遍历所有可能的列 for col_idx in range(1, old_sht.max_column 1): col_letter get_column_letter(col_idx) if col_letter in old_sht.column_dimensions: # 列存在且有明确定义的宽度 column_width old_sht.column_dimensions[col_letter].width # print(fColumn {column} has width: {column_width}) new_sht.column_dimensions[col_letter].width column_width else: # 列存在但没有明确定义的宽度可以设置一个默认值 new_sht.column_dimensions[col_letter].width 14.35