当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/1227813/

相关文章:

  • Hitboxer终极指南:如何用免费开源工具彻底解决游戏方向键冲突
  • C语言在操作系统开发中的核心优势与不可替代性
  • 本地文件智能问答:LangChain+RAG离线落地实战
  • 你的音乐品味如何在Discord上成为社交名片?NetEase-Cloud-Music-DiscordRPC的秘密魔法
  • TI EMAC/MDIO中断机制深度解析:从寄存器配置到稳健ISR实战
  • 生产级机器学习系统:从模型部署到决策可信的工程实践
  • 06-CLI命令参考
  • QuickJS架构解密:深度解析嵌入式JavaScript引擎的系统级设计
  • iOS 17 JIT编译终极解决方案:SideJITServer完整使用指南
  • dive into python 别只会Dive Into Python!C语言版超级玛丽,才是你童年欠下的债
  • Java编程基础词汇全解析与实战应用
  • Android音频终极优化指南:Audio-Misc-Settings模块深度解析与实战配置
  • GitHub精准下载终极指南:告别臃肿仓库,只带走你需要的文件
  • C++实战指南:从核心概念到现代开发实践
  • ETS2LA:为《欧洲卡车模拟2》带来革命性自动驾驶体验的智能插件平台
  • C2000 GPIO寄存器操作与硬件消抖实战指南
  • Resurrectio扩展开发指南:自定义事件录制与渲染器
  • 玉溪低压高压电工焊工高处作业培训考试学校,推荐到玉溪滇商职业技能培训学校 - 资讯焦点
  • Claude Code与Codex集成:AI辅助编程新实践
  • 全新IM即时通讯系统升级上线|打造专属企业沟通平台
  • 如何解决网页媒体资源难以保存的难题?猫抓浏览器扩展为您提供一站式解决方案
  • Faraday开源漏洞管理平台架构深度解析:企业级安全态势统一管理方案
  • 如何用TMSpeech实现Windows离线实时语音转文字?终极免费方案指南
  • Windows 11终极清理指南:用Win11Debloat一键告别系统臃肿
  • CyberpunkSaveEditor 技术架构深度解析:赛博朋克2077存档文件编辑实现原理
  • TI EDMA控制器深度解析:影子区域、中断与内存保护实战指南
  • 终极Wand-Enhancer完整指南:如何免费解锁专业版游戏修改功能
  • 终极Hitboxer指南:免费开源SOCD清洁工具让你的游戏操作更精准
  • 心肌梗死多组学分析:SCENIC+构建时空动态调控网络
  • 5分钟从图片到3D打印模型:ImageToSTL完全指南