news 2026/7/20 11:29:37

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_only=True): target_sheet.append(row)

上面所提及的代码, 仅仅是复制了数据, 然而, 却并未复制数据格式, 以及合并单元格这类表格样式。

跨工作簿带格式复制分类

从工作簿之外带着格式进行复制操作, 总体而言大致可以划分成两类情形: 其一, 直接从文件里读取相关内容, 接着实施复制;其二, 已经借助库把数据读取到内存当中, 在经过数据方面的处理之后, 需要将工作表复制到一个全新的电子表格里予以保存。

第一类:

第一种偏简单, 于互联网络之上亦能瞅见好多汇总, 我这儿亦寻觅到其中之一予以举个例子:

# 代码1:带格式复制一个sheet到另一个sheet from openpyxl import load_workbook import xlwings as xw app = xw.App(visible=False, add_book=False) 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(before=target_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_row+1): # 最大行+1 for j in range(1, old_sht.max_column+1): #最大列+1 src_cell = old_sht.cell(i, j) # getattr(ws.cell(row=m,column=c),"value") new_sht.cell(row=i,column=j).value=src_cell.value if src_cell.has_style: #拷贝格式 new_sht.cell(row=i, column=j).font = copy(src_cell.font) new_sht.cell(row=i, column=j).border = copy(src_cell.border) new_sht.cell(row=i, column=j).fill = copy(src_cell.fill) new_sht.cell(row=i, column=j).number_format = copy(src_cell.number_format) new_sht.cell(row=i, column=j).protection = copy(src_cell.protection) new_sht.cell(row=i, column=j).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(f"Column {column} has width: {column_width}") new_sht.column_dimensions[col_letter].width = column_width else: # 列存在但没有明确定义的宽度,可以设置一个默认值 new_sht.column_dimensions[col_letter].width = 14.35
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 11:27:54

类变量和实例变量在继承中的表现有什么不同?

类变量与实例变量在继承中的行为差异一、核心结论先记牢类变量支持继承:子类可读取父类类变量;子类赋值同名类变量会独立一份,不影响父类;父类修改类变量会同步所有未重写该变量的子类。实例变量不继承:实例变量属于单…

作者头像 李华
网站建设 2026/7/20 11:27:05

全新升级IM聊天软件上线|企业级即时通讯系统定制部署方案

全新升级IM聊天软件上线|企业级即时通讯系统定制部署方案 🚀 全新升级!IM聊天软件正式上线! 熟悉的使用体验,更强大的系统能力,全平台应用生态持续完善,为企业与团队提供更加稳定、高效的即时通…

作者头像 李华
网站建设 2026/7/20 11:27:03

VC++编程从入门到实践:现代Windows开发环境搭建与核心技能精讲

1. 项目概述:为什么VC在今天依然值得投入?如果你在搜索引擎里敲下“VC编程从入门到实践”,大概率会看到两种声音:一种是“都什么年代了还学VC?”,另一种是“工业软件、游戏引擎、金融交易系统,哪…

作者头像 李华
网站建设 2026/7/20 11:26:59

解决Windows Python安装包报错:Microsoft Visual C++ 14.0缺失的四种方案

1. 问题本质与根源剖析如果你在Windows上用Python的pip安装某些第三方包时,突然蹦出来一个“error: Microsoft Visual C 14.0 or greater is required.”的红色错误,先别急着骂娘,也别慌。这几乎是每个Windows平台Python开发者都会踩的坑&…

作者头像 李华
网站建设 2026/7/20 11:26:56

三方聊天软件工具定制开发|打造安全稳定的企业级IM通讯解决方案

** ** 随着企业数字化沟通需求不断提升,稳定、高效、安全的即时通讯系统已经成为团队协作的重要基础。我们专注于 IM聊天软件工具定制开发与私有化部署,为企业提供灵活可扩展的通讯解决方案,满足不同业务场景下的沟通需求。 🚀 核…

作者头像 李华
网站建设 2026/7/20 11:26:38

深入解析TMS320F28P65x系统控制与中断寄存器:从原理到实战

1. 项目概述:深入TMS320F28P65x的系统控制与中断寄存器在嵌入式开发,尤其是工业控制、电机驱动和数字电源这些对实时性和可靠性要求极高的领域,我们这些工程师打交道最多的,往往不是那些花哨的算法,而是芯片最底层的寄…

作者头像 李华