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

别再只会用pandas了!用openpyxl的load_workbook处理Excel,这些坑我帮你踩过了

别再只会用pandas了用openpyxl的load_workbook处理Excel这些坑我帮你踩过了当Python开发者需要处理Excel文件时pandas往往是首选工具——它简单、高效能快速完成数据导入导出。但当你面对复杂格式的Excel文件比如需要精确控制单元格样式、处理合并单元格或多Sheet协作时pandas就显得力不从心了。这时openpyxl的load_workbook才是真正的瑞士军刀。我在三个大型数据迁移项目中深度使用了openpyxl期间踩过的坑足以写满一张A4纸。本文将分享如何绕过这些陷阱高效利用load_workbook处理复杂Excel文件。无论你是需要保留原始格式的数据工程师还是开发需要精细控制Excel输出的自动化工具这些经验都能让你少走弯路。1. 为什么选择openpyxl而不是pandaspandas的read_excel确实方便但它本质上是一个数据分析和处理工具而非Excel文件操作库。当你的需求超出简单数据读写时openpyxl的优势就显现出来了样式保留pandas读取后会丢失所有样式信息而openpyxl能完整保留字体、颜色、边框等格式合并单元格处理pandas会自动展开合并单元格而openpyxl可以识别并保持合并状态多Sheet协作openpyxl支持在多个Sheet间直接引用和操作性能优化对于大型文件openpyxl的内存模式(read_only)可以显著降低内存占用# pandas读取会丢失样式信息 import pandas as pd df pd.read_excel(styled_file.xlsx) # openpyxl保留完整样式 from openpyxl import load_workbook wb load_workbook(styled_file.xlsx) ws wb.active cell ws[A1] print(cell.font, cell.fill, cell.border) # 可以获取完整样式信息2. load_workbook的核心用法与性能陷阱2.1 基础加载模式load_workbook有两种主要加载模式选择不当会导致性能问题模式参数适用场景内存占用速度普通模式默认小型文件需要修改高快只读模式read_onlyTrue大型文件仅读取低慢只写模式write_onlyTrue生成大型文件中快# 错误示范用默认模式读取100MB的Excel文件 wb load_workbook(huge_file.xlsx) # 内存爆炸 # 正确做法大文件使用只读模式 wb load_workbook(huge_file.xlsx, read_onlyTrue)2.2 工作表访问的坑新手常犯的错误是直接使用wb.active这其实依赖Excel文件中存储的活动工作表信息可能不是你想要的Sheet# 不可靠的写法 ws wb.active # 可能返回任意Sheet # 可靠的三种写法 ws wb[Sheet1] # 按名称 ws wb.worksheets[0] # 按索引 ws next(wb.worksheets) # 第一个工作表注意read_only模式下某些工作表属性不可用如wb.worksheets会报错应改用wb.sheetnames获取名称列表3. 合并单元格处理的正确姿势合并单元格是Excel处理中最棘手的部分之一。pandas会自动展开合并区域而openpyxl则保留了原始结构但这带来了新的挑战。3.1 检测合并区域ws wb[Sheet1] merged_ranges ws.merged_cells.ranges # 获取所有合并区域 # 打印所有合并区域 for merged_range in merged_ranges: print(f合并区域: {merged_range}) print(f左上角值: {ws[merged_range.min_row][merged_range.min_col-1].value})3.2 遍历合并单元格数据合并区域中只有左上角单元格存储实际值其他单元格值为None。这是一个常见陷阱# 错误示范直接遍历会得到None值 for row in ws[A1:D10]: for cell in row: print(cell.value) # 合并区域非左上角单元格会输出None # 正确做法先检查是否在合并区域 def get_cell_value(cell): for merged_range in ws.merged_cells.ranges: if cell.coordinate in merged_range: return ws[merged_range.min_row][merged_range.min_col-1].value return cell.value # 现在可以安全获取值 print(get_cell_value(ws[B2]))4. 样式读取与修改实战保留和修改样式是openpyxl的杀手级功能但API设计有些反直觉4.1 读取现有样式cell ws[A1] # 获取样式属性 font cell.font fill cell.fill border cell.border alignment cell.alignment print(f字体: {font.name}, 大小: {font.size}, 加粗: {font.bold}) print(f填充: {fill.patternType}, 前景色: {fill.fgColor.rgb}) print(f边框: 左{border.left.style}, 右{border.right.style}) print(f对齐: {alignment.horizontal}, {alignment.vertical})4.2 修改样式的最佳实践直接修改样式会影响工作簿中所有使用该样式的单元格正确做法是先复制再修改from copy import copy # 错误示范直接修改会影响其他单元格 ws[B2].font.bold True # 不推荐 # 正确做法创建新样式对象 new_font copy(ws[B2].font) new_font.bold True ws[B2].font new_font # 复杂样式修改示例 from openpyxl.styles import Font, PatternFill, Border, Side # 创建新样式 bold_red_font Font(nameCalibri, size11, boldTrue, colorFF0000) yellow_fill PatternFill(start_colorFFFF00, end_colorFFFF00, fill_typesolid) thin_border Border(leftSide(stylethin), rightSide(stylethin), topSide(stylethin), bottomSide(stylethin)) # 应用样式 ws[C3].font bold_red_font ws[C3].fill yellow_fill ws[C3].border thin_border5. 高效写入与性能优化当需要写入大量数据时有几个关键技巧可以显著提升性能5.1 批量写入数据# 低效写法逐个单元格写入 for i in range(1, 1001): for j in range(1, 101): ws.cell(rowi, columnj, valuef{i}-{j}) # 高效写法批量操作 data [[f{i}-{j} for j in range(1, 101)] for i in range(1, 1001)] for row in data: ws.append(row)5.2 使用只写模式生成大文件from openpyxl import Workbook wb Workbook(write_onlyTrue) ws wb.create_sheet() # 只写模式下必须使用append添加整行数据 for row in range(1, 10001): ws.append([fData {row}, row, row*2]) wb.save(large_file.xlsx)5.3 内存优化技巧处理特大文件时可以结合以下策略使用read_only模式读取处理完立即删除不需要的工作表定期保存并重新加载# 处理大文件示例 src_wb load_workbook(huge_source.xlsx, read_onlyTrue) dst_wb Workbook() for sheetname in src_wb.sheetnames[:5]: # 只处理前5个Sheet src_ws src_wb[sheetname] dst_ws dst_wb.create_sheet(sheetname) for row in src_ws.iter_rows(values_onlyTrue): processed_row [str(x).upper() if x else for x in row] dst_ws.append(processed_row) # 及时释放内存 del src_ws src_wb.close() dst_wb.save(processed_file.xlsx)6. 实际项目中的经验分享在金融报表自动化项目中我遇到一个棘手问题某些单元格的值在openpyxl中显示为None但在Excel中却有值。经过排查发现这些单元格使用了共享字符串表而read_only模式下需要特殊处理wb load_workbook(financial_report.xlsx, read_onlyTrue, keep_vbaTrue) ws wb[Balance Sheet] # 普通读取可能丢失值 print(ws[B10].value) # 可能显示None # 正确读取共享字符串 from openpyxl.utils import get_column_letter def get_shared_string(cell): if cell.data_type s: # 共享字符串类型 return wb.shared_strings[int(cell.value)] return cell.value print(get_shared_string(ws[B10]))另一个常见问题是公式计算。openpyxl默认不会计算公式结果需要手动处理# 启用公式计算 wb load_workbook(with_formulas.xlsx, data_onlyFalse) # 读取公式本身 print(ws[C5].value) # 显示公式如SUM(A1:A10) # 获取计算后的值需要Excel事先计算过 wb load_workbook(with_formulas.xlsx, data_onlyTrue) print(ws[C5].value) # 显示计算结果如123.45最后分享一个样式继承的坑新建单元格默认会继承行或列的样式这可能导致意外的样式污染。清除继承样式的方法# 创建真正无样式的单元格 from openpyxl.styles import NamedStyle no_style NamedStyle(nameno_style) cell ws[A1] cell.style no_style # 清除所有继承样式

相关文章:

别再只会用pandas了!用openpyxl的load_workbook处理Excel,这些坑我帮你踩过了

别再只会用pandas了!用openpyxl的load_workbook处理Excel,这些坑我帮你踩过了 当Python开发者需要处理Excel文件时,pandas往往是首选工具——它简单、高效,能快速完成数据导入导出。但当你面对复杂格式的Excel文件,比…...

长期使用taotoken服务观察其api服务的稳定性与可用性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用 Taotoken 服务观察其 API 服务的稳定性与可用性 在持续数周将 Taotoken 作为主要的大模型 API 接入平台进行开发与测试后…...

5.3、从双亲表示法看树的存储设计哲学

1. 双亲表示法的本质:用数组重构树形关系 第一次接触双亲表示法时,我被它的简洁性惊艳到了——仅用数组就能完整描述整棵树的拓扑结构。这种存储方式的核心在于:每个节点只需要记住自己的父亲是谁。就像现实中的家族族谱,我们通过…...

Taskbar11完全指南:解锁Windows 11任务栏自定义的终极解决方案

Taskbar11完全指南:解锁Windows 11任务栏自定义的终极解决方案 【免费下载链接】Taskbar11 Change the position and size of the Taskbar in Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar11 还在为Windows 11任务栏的严格限制感到困扰吗…...

告别点灯:用STM32+FPGA+FSMC做个数据吞吐测试仪(附Quartus与标准库工程)

STM32与FPGA联袂打造:高性能数据吞吐测试仪实战指南 在嵌入式系统开发中,总线通信性能往往是决定整体系统响应速度的关键瓶颈。对于硬件爱好者、电子工程师和学生群体而言,如何直观测量和优化总线传输效率,是一个既具挑战性又充满…...

STM32 FOC SDK V3.2深度解析:从模块架构到PI整定实战

1. 项目概述:从零到一,理解ST官方FOC SDK的实战价值 如果你正在用STM32做电机控制,尤其是永磁同步电机(PMSM),那么ST官方发布的PMSM FOC SDK(Software Development Kit)绝对是你绕不…...

原来选对床垫竟然这么重要?2026年内行都推荐这几款

原来选对床垫竟然这么重要?2026年内行都推荐这几款在追求高质量生活的今天,一个舒适的睡眠环境变得越来越重要。而床垫作为睡眠质量的关键因素之一,选择一款合适的床垫显得尤为重要。本文将探讨如何选择适合自己的床垫,并推荐几款…...

高通865刷机救砖实战:从驱动准备到QPST全流程解析

1. 高通865刷机救砖前的准备工作 遇到手机变砖的情况,很多小伙伴第一反应就是慌。别急,我当初第一次给高通865设备救砖时也手忙脚乱,后来发现只要工具准备齐全,整个过程其实挺简单的。咱们先把这些必备工具和文件都准备好&#xf…...

2026 年软硬两用床垫,为何能做到不塌陷?

引言随着科技的不断进步和消费者需求的多样化,床垫市场也在不断创新。特别是软硬两用床垫,因其能够满足不同人群的需求而备受青睐。然而,如何确保床垫在长时间使用后不塌陷,仍然是一个技术难题。本文将探讨2026年软硬两用床垫如何…...

Vivado 2022.2 中文用户名下,Vscode关联失效的终极修复与Verilog环境配置

Vivado 2022.2中文用户环境下的Vscode-Verilog开发全栈配置指南 当FPGA开发者遇到Windows中文用户名导致的Vivado-Vscode关联失效时,往往需要花费数小时排查环境问题。本文将系统性地解决这一痛点,并提供完整的Verilog开发环境配置方案。 1. 中文路径问题…...

万维网免费开放30年:除了浏览器,我们还能从CERN的决策中学到什么开源哲学?

万维网开源决策的启示:从技术公共性到开发者行动指南 1993年4月30日,欧洲核子研究中心(CERN)宣布将万维网技术置于公共领域,这一决定彻底改变了人类获取信息的方式。当我们回溯这个历史性时刻,会发现它远不…...

从硬件连接到数据可视化:基于RS485-USB的传感器数据采集全流程解析

1. 硬件连接:从传感器到电脑的物理链路搭建 工业传感器数据采集的第一步,就是建立可靠的物理连接。以常见的星仪压力变送器为例,我们需要解决三个关键问题:传感器供电、信号传输转换、以及电脑端识别。这里我分享几个实际项目中容…...

从Struts2漏洞看Java Web安全:一个OGNL表达式注入引发的十年“血案”

OGNL表达式注入:Struts2框架安全漏洞的十年演进与启示 2006年,当Struts2作为Struts框架的下一代产品首次亮相时,开发者社区对其寄予厚望。这个基于MVC架构的Java Web框架承诺提供更简洁的代码结构和更强大的功能扩展性。然而,很少…...

通过curl命令快速测试Taotoken提供的各类大模型效果

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken提供的各类大模型效果 对于开发者,尤其是运维和测试人员来说,在集成或评估一…...

如何彻底摆脱网盘限速:8大主流网盘直链下载助手完整指南

如何彻底摆脱网盘限速:8大主流网盘直链下载助手完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

如何用N_m3u8DL-RE破解加密流媒体:跨平台下载的终极指南

如何用N_m3u8DL-RE破解加密流媒体:跨平台下载的终极指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …...

三分钟解锁Windows 11任务栏:Taskbar11让你的桌面重获自由

三分钟解锁Windows 11任务栏:Taskbar11让你的桌面重获自由 【免费下载链接】Taskbar11 Change the position and size of the Taskbar in Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar11 还在为Windows 11那固执的任务栏设置感到束手无策…...

Windows热键冲突终结者:3步精准定位占用进程的智能方案

Windows热键冲突终结者:3步精准定位占用进程的智能方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾…...

告别抓瞎:手把手教你解读usbmon抓到的原始数据(附字段含义详解)

USB数据解码实战:从usbmon原始输出到可读通信分析 当你第一次看到usbmon捕获的原始数据时,那串由十六进制数字和神秘符号组成的"天书"确实令人望而生畏。作为一名曾经同样困惑的技术探索者,我完全理解这种面对海量数据却无从下手的…...

从汽车电子到工业控制:手把手教你用STM32CubeMX和HAL库玩转CAN总线多节点通信

从零构建工业级CAN总线通信系统:基于STM32CubeMX的实战指南 1. CAN总线技术基础与工业应用场景 在现代工业控制系统中,CAN总线因其高可靠性和实时性已成为设备间通信的事实标准。不同于普通串行通信,CAN采用差分信号传输和先进的错误检测机…...

告别Xshell:免费利器FinalShell的Linux远程连接与高效运维实战

1. 为什么选择FinalShell替代Xshell? 作为长期使用Xshell的老用户,我完全理解大家对这款经典SSH客户端的依赖。但最近两年,我逐渐将团队的所有运维工作迁移到了FinalShell。这个决定不仅帮我们省下了每年数千元的软件授权费用,更重…...

实战剖析:利用Fluxion构建WiFi钓鱼热点与密码捕获

1. 环境准备与工具安装 在开始使用Fluxion进行WiFi安全测试之前,我们需要确保具备合适的硬件和软件环境。首先,你需要一台支持监听模式的无线网卡,这是进行任何无线安全测试的基础硬件。我推荐使用RTL8812AU芯片的网卡,实测下来兼…...

别再手动贴图了!LOD1.3建模的智能纹理库怎么用?手把手教你配置大势智慧材质模板

LOD1.3建模革命:智能纹理库的实战配置指南 当清晨的第一缕阳光透过窗户洒在建模师的工作台上,那些曾经需要数小时手动贴图的建筑模型,如今只需几分钟就能自动完成纹理匹配。这不是未来场景,而是LOD1.3建模中智能纹理库技术带来的…...

InfluxDB-从时序数据模型到实战:核心原理与Web UI高效入门

1. 时序数据库与InfluxDB初探 第一次接触时序数据库时,我盯着监控大屏上跳动的曲线发愣——这些每秒产生数万条记录的传感器数据,传统数据库根本扛不住。直到同事推荐了InfluxDB,这个专门为时间序列数据设计的数据库,才真正解决了…...

数字孪生+高斯泼溅+CIMPro孪大师,打造申报“硬通货”

当前,2026年全国智能工厂梯度培育申报窗口期正在密集推进中。从四川、江苏到福建、安徽,各地工信部门纷纷下发《关于做好2026年度智能工厂梯度培育有关工作的通知》,2025年至2027年是基础级、卓越级、领航级智能工厂建设的三年关键窗口期。你…...

从‘果冻屏’到‘瀑布屏’:OCA全贴合工艺如何悄悄改变了你的视觉体验?

从‘果冻屏’到‘瀑布屏’:OCA全贴合工艺如何悄悄改变了你的视觉体验? 还记得十年前那些让人抓狂的“果冻屏”吗?阳光下泛着彩虹纹,触控时总感觉隔着一层毛玻璃,甚至能清晰看到屏幕边缘积攒的灰尘。如今拿起任何一款旗…...

N_m3u8DL-RE:跨平台流媒体下载终极指南

N_m3u8DL-RE:跨平台流媒体下载终极指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE 在当今数字时…...

5分钟精通英雄联盟信息修改:LeaguePrank新手完全使用指南

5分钟精通英雄联盟信息修改:LeaguePrank新手完全使用指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾在英雄联盟中羡慕别人的华丽段位边框,却苦于自己的段位不够理想?你是否想要…...

抖音下载器技术方案:重构短视频内容采集架构的90%效率提升方案

抖音下载器技术方案:重构短视频内容采集架构的90%效率提升方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallba…...

FreeRTOS优先级设置踩坑实录:为什么你的高优先级任务跑不起来?

FreeRTOS优先级设置实战指南:从原理到调试的完整解决方案 当你第一次在FreeRTOS中创建多个任务并设置不同优先级时,可能会遇到一个令人困惑的现象:明明设置了高优先级任务,但系统运行时低优先级任务却先执行。这种情况在从其他RT…...