2026/9/3 9:10:06

Python操作Excel实战指南:openpyxl与xlrd库详解与自动化应用

Python操作Excel实战指南:openpyxl与xlrd库详解与自动化应用 简介本资源是一套面向Python初学者与办公自动化开发者的Excel操作实战代码集聚焦Python3环境下新版.xlsx与旧版.xls文件的读写、格式设置及批量修改等高频需求。资源共2094个文件以990个Python源码为主干辅以988个编译缓存文件、17个说明文本、8个xls/xlsx示例数据及若干可执行工具与环境配置文件整体压缩包7.91MB结构清晰便于按功能模块快速定位。已有759人学习下载涵盖openpyxl对.xlsx文件的行高列宽设置、单元格合并、样式应用等完整操作链以及xlrdxutils.copy组合实现.xls文件读取与修订保存的典型流程。所有脚本均经实测验证配套注释详尽可直接复用或二次开发特别适合需要处理多版本Excel、提升数据处理效率的开发者与数据分析人员。1. 项目概述为什么Python操作Excel是程序员的必备技能在数据处理和办公自动化的日常工作中Excel文件几乎是绕不开的存在。无论是市场部门提供的销售报表还是财务同事发来的预算清单甚至是自己记录的一些临时数据.xlsx或.xls格式的文件无处不在。作为一名开发者如果每次都需要手动打开Excel进行复制、粘贴、筛选、计算不仅效率低下而且极易出错尤其是在处理成百上千行数据时。这就是为什么掌握用Python编程操作Excel的能力从一个“加分项”变成了很多岗位的“必备技能”。它让你能自动化处理重复性劳动将数据清洗、格式转换、批量计算等任务交给脚本解放双手把精力集中在更有价值的逻辑分析和决策上。今天我就结合自己多年的实战经验深入聊聊如何用Python的两个核心库——openpyxl和xlrd来玩转Excel。我会从最基础的读写讲起覆盖格式调整、公式处理、图表生成等高级操作并附上大量可直接复用的案例源码。无论你是刚入门的数据分析新手还是需要优化工作流的老手这篇文章都能给你带来实实在在的帮助。2. 核心库选型解析openpyxl与xlrd的定位与抉择面对Python操作Excel的众多库如pandas,xlwings,xlsxwriter等为什么我们重点讨论openpyxl和xlrd这取决于你的具体需求和文件格式。这两个库职责分明互补性很强。2.1 openpyxl现代.xlsx文件的瑞士军刀openpyxl是当前处理.xlsx格式Excel 2007及以上版本的事实标准库。它的功能非常全面读写兼备既能读取现有工作簿的数据、公式、样式也能从头创建或修改工作簿。样式操作精细可以精确控制单元格的字体、颜色、边框、对齐方式、数字格式等这对于生成需要直接交付给业务方的报告至关重要。图表支持支持创建多种类型的图表如折线图、柱状图、散点图并插入到工作表中实现数据可视化自动化。公式处理可以读取单元格中的公式也支持写入公式。不过需要注意的是openpyxl本身不计算公式结果它依赖Excel应用程序打开文件时进行计算。但可以读取已由Excel计算好的值。其他高级功能支持冻结窗格、设置打印区域、添加注释、合并单元格、数据验证等。注意openpyxl不支持旧的.xls格式。如果你的数据源是.xls文件需要先用其他方式如xlrd读取后转存或工具转换为.xlsx。2.2 xlrd经典.xls文件的读取专家xlrd库的历史更悠久它专注于一件事读取.xls格式Excel 97-2003的文件。在xlrd2.0.0版本之后它移除了对.xlsx格式的支持专注于做好.xls的读取器。核心优势读取.xls文件速度快内存占用相对较低API简单直接。主要局限只能读不能写。它无法创建或修改Excel文件。如果需要编辑.xls通常需要结合xlwt用于写.xls或xlutils用于修改库但这套组合对新版.xlsx支持不佳且已停止维护。应用场景当你需要从遗留系统、老旧设备导出的.xls文件中快速提取数据时xlrd是不二之选。提取出的数据可以方便地存入数据库或用openpyxl写入新的.xlsx报告。选型决策流程图简化操作的文件是.xlsx格式吗是 - 主要使用openpyxl(读写皆可)。否 - 文件是.xls格式吗是 - 仅需读取数据 - 使用xlrd。是 - 需要修改或写入- 考虑使用xlrdxlwt旧方案或强烈建议先将文件转换为.xlsx格式再用openpyxl处理这是更面向未来的做法。在实际项目中我经常遇到需要同时处理新旧格式文件的情况。我的标准做法是用xlrd读取旧的.xls数据经过程序处理和分析后使用openpyxl生成格式美观、包含图表的新版.xlsx报告一举两得。3. 环境准备与基础操作入门工欲善其事必先利其器。在开始编写复杂的自动化脚本之前让我们先把环境搭建好并过一遍最基础的读写操作。3.1 安装依赖库通过pip安装这两个库非常简单。建议在虚拟环境中操作以避免包版本冲突。# 安装 openpyxl用于操作 .xlsx 文件 pip install openpyxl # 安装 xlrd用于读取 .xls 文件 (注意安装最新版即可它只支持.xls) pip install xlrd安装完成后可以在Python交互环境中导入测试一下import openpyxl import xlrd print(openpyxl.__version__) print(xlrd.__version__)3.2 openpyxl基础读写案例我们先从一个最简单的例子开始创建一个新的Excel文件写入一些数据然后保存。from openpyxl import Workbook from openpyxl.styles import Font, Alignment # 1. 创建一个新的工作簿 wb Workbook() # 获取默认激活的工作表 ws wb.active ws.title 销售数据 # 给工作表重命名 # 2. 写入表头和数据 headers [日期, 产品, 销售额, 销售量] data [ [2023-10-01, 产品A, 15000, 120], [2023-10-01, 产品B, 9800, 85], [2023-10-02, 产品A, 16500, 135], ] # 写入表头 for col, header in enumerate(headers, start1): cell ws.cell(row1, columncol, valueheader) # 给表头加粗并居中 cell.font Font(boldTrue) cell.alignment Alignment(horizontalcenter) # 写入数据行 for row_idx, row_data in enumerate(data, start2): # 从第2行开始 for col_idx, cell_data in enumerate(row_data, start1): ws.cell(rowrow_idx, columncol_idx, valuecell_data) # 3. 简单计算在末尾添加一行总计 total_row len(data) 2 # 数据行数 表头行 1 ws.cell(rowtotal_row, column3, valuefSUM(C2:C{total_row-1})) # 销售额总计 ws.cell(rowtotal_row, column4, valuefSUM(D2:D{total_row-1})) # 销售量总计 ws.cell(rowtotal_row, column1, value总计).font Font(boldTrue) # 4. 自动调整列宽近似 for column in ws.columns: max_length 0 column_letter column[0].column_letter # 获取列字母 for cell in column: try: if len(str(cell.value)) max_length: max_length len(str(cell.value)) except: pass adjusted_width (max_length 2) ws.column_dimensions[column_letter].width adjusted_width # 5. 保存文件 file_path sales_report.xlsx wb.save(file_path) print(f文件已保存至{file_path})这段代码完成了创建一个带有基础格式和公式的Excel文件的全过程。关键点在于ws.cell(rowr, columnc, valuev)这个核心方法它通过行号和列号来定位单元格。openpyxl的行列索引都是从1开始的这符合Excel的习惯但和Python中列表从0开始的习惯不同需要稍加注意。3.3 xlrd基础读取案例现在假设我们收到一个旧的daily_sales.xls文件需要读取其中的数据。import xlrd def read_old_excel(file_path): 读取 .xls 格式的Excel文件 # 1. 打开工作簿 # encoding_override 参数有时对中文文件名或内容编码有帮助 workbook xlrd.open_workbook(file_path, encoding_overrideutf-8) # 2. 获取所有工作表名 sheet_names workbook.sheet_names() print(f工作表列表{sheet_names}) # 3. 通过索引或名称获取第一个工作表 sheet workbook.sheet_by_index(0) # 或 sheet_by_name(Sheet1) # 4. 获取表格的基本信息 print(f工作表名称{sheet.name}) print(f总行数{sheet.nrows}) print(f总列数{sheet.ncols}) # 5. 读取数据 data_list [] # 通常跳过表头第0行从第1行开始读数据 for row_idx in range(1, sheet.nrows): # range是前闭后开 row_data [] for col_idx in range(sheet.ncols): cell sheet.cell(row_idx, col_idx) # cell.ctype 表示单元格类型 0empty, 1string, 2number, 3date, 4boolean, 5error cell_value cell.value # 处理日期类型xlrd读取日期是浮点数需要转换 if cell.ctype 3: try: # xlrd的xldate_as_tuple将Excel日期数字转换为元组 date_tuple xlrd.xldate_as_tuple(cell_value, workbook.datemode) cell_value f{date_tuple[0]}-{date_tuple[1]:02d}-{date_tuple[2]:02d} except: pass # 如果转换失败保留原值 row_data.append(cell_value) data_list.append(row_data) # 也可以按需打印 # print(row_data) return data_list # 使用示例 if __name__ __main__: data read_old_excel(daily_sales.xls) print(f共读取到 {len(data)} 行数据) for row in data[:3]: # 打印前3行看看 print(row)xlrd的API非常直观open_workbook打开文件sheet_by_*获取工作表然后用nrows和ncols确定范围最后用cell(row, col).value读取值。需要特别留意的是日期处理Excel内部将日期存储为数字xlrd需要专门的函数进行转换这是新手常踩的坑。4. 进阶操作与实战技巧掌握了基础读写我们来看看一些更贴近实际需求的进阶操作。这些技巧能让你的自动化脚本更加健壮和高效。4.1 使用openpyxl处理大型文件与样式批量操作当文件很大几万行时openpyxl默认的读取方式会加载所有单元格对象到内存可能变慢。此时可以使用read_only模式进行只读流式读取以及write_only模式进行只写流式写入。只读模式示例from openpyxl import load_workbook large_file very_large_data.xlsx # 使用 read_only 模式仅加载元数据单元格按需读取 wb load_workbook(filenamelarge_file, read_onlyTrue) ws wb.active # 遍历行此时单元格值才被真正加载 for row in ws.iter_rows(min_row2, values_onlyTrue): # values_onlyTrue 直接返回值不返回Cell对象 # 处理每一行数据例如筛选或统计 if row[2] 10000: # 假设第三列是销售额 print(row) # 注意read_only模式下不能修改工作表也不能获取某些属性如 max_row wb.close()批量应用样式给一个区域的所有单元格加边框或背景色逐个设置效率很低。from openpyxl.styles import Border, Side, PatternFill, Alignment from openpyxl import load_workbook wb load_workbook(template.xlsx) ws wb.active # 定义样式 thin_border Border(leftSide(stylethin), rightSide(stylethin), topSide(stylethin), bottomSide(stylethin)) header_fill PatternFill(start_colorCCE5FF, end_colorCCE5FF, fill_typesolid) # 浅蓝色填充 center_aligned Alignment(horizontalcenter, verticalcenter) # 批量应用给A1到D10区域加边框和居中 from openpyxl.utils import range_boundaries min_col, min_row, max_col, max_row range_boundaries(A1:D10) for row in ws.iter_rows(min_rowmin_row, max_rowmax_row, min_colmin_col, max_colmax_col): for cell in row: cell.border thin_border cell.alignment center_aligned # 如果是第一行再加个背景色 if cell.row 1: cell.fill header_fill wb.save(styled_template.xlsx)4.2 复杂数据读取与类型处理陷阱无论是openpyxl还是xlrd从Excel读取数据到Python时类型转换都可能出问题。数字与文本Excel里看起来是数字“001”可能被读成整数1。如果需要在Python中保留前导零必须在Excel中先将单元格格式设置为“文本”或者用openpyxl读取时通过data_type判断并处理。空单元格与Noneopenpyxl对于空单元格返回None。xlrd对于空单元格cell.ctype为0cell.value为空字符串。在数据处理时务必做好空值判断避免后续计算如sum出错。合并单元格openpyxl中只有合并区域左上角的单元格有值其他单元格为None。遍历时需要小心。可以使用ws.merged_cells.ranges来获取所有合并区域的信息。公式单元格openpyxl的cell.value存储的是公式字符串如SUM(A1:A10)而cell.data_type为f。如果需要公式计算后的结果必须确保这个文件曾被Excel应用程序打开并计算过然后通过cell.value读取的会是计算结果如果文件是openpyxl新建且未用Excel打开过则cell.value仍是公式字符串。一个变通方法是对于简单的求和、平均可以在Python中直接计算。实战案例安全读取并清洗数据def safe_read_cell(cell): 安全地读取openpyxl单元格的值处理空值和类型 value cell.value if value is None: return # 或者 return None 根据下游需求决定 # 如果是数字但希望作为字符串处理如工号 if isinstance(value, (int, float)) and cell.number_format : # 是文本格式的代码 return str(int(value)) if isinstance(value, float) and value.is_integer() else str(value) return value # 使用示例 from openpyxl import load_workbook wb load_workbook(data_with_issues.xlsx) ws wb.active cleaned_data [] for row in ws.iter_rows(min_row2): row_data [safe_read_cell(cell) for cell in row] # 进一步清洗去除全是空值的行 if any(cell ! for cell in row_data): cleaned_data.append(row_data)4.3 动态图表生成与报表自动化这是openpyxl非常强大的一个功能。你可以用代码生成图表并插入到工作表中实现数据报告的全自动生成。from openpyxl import Workbook from openpyxl.chart import BarChart, Reference, Series # 假设我们已经有一个包含数据的工作表 ws wb Workbook() ws wb.active ws.title 月度业绩 # 填入一些示例数据 data [ [月份, 销售额, 成本], [1月, 40000, 22000], [2月, 48000, 25000], [3月, 52000, 27000], [4月, 61000, 30000], ] for r in data: ws.append(r) # 1. 创建一个柱状图对象 chart BarChart() chart.type col # 柱状图 chart.style 10 # 预定义的样式可以换 chart.title 月度销售额与成本对比 chart.y_axis.title 金额元 chart.x_axis.title 月份 # 2. 定义数据区域 # 数据从B2到C6销售额和成本数据 data_ref Reference(ws, min_col2, min_row2, max_col3, max_row6) # 类别X轴从A2到A6月份 categories Reference(ws, min_col1, min_row2, max_row6) # 3. 将数据添加到图表 chart.add_data(data_ref, titles_from_dataTrue) chart.set_categories(categories) # 4. 将图表插入到工作表例如放在E2单元格的位置 ws.add_chart(chart, E2) # 5. 保存 wb.save(report_with_chart.xlsx)通过调整BarChart为LineChart、PieChart等可以轻松创建折线图、饼图。openpyxl的图表API允许你设置标题、图例位置、坐标轴范围等几乎所有在Excel界面中可以设置的属性。5. 综合实战案例构建一个销售数据自动化处理管道让我们把所有知识点串联起来模拟一个真实的业务场景每天需要处理来自不同渠道新旧格式都有的销售明细清洗后汇总并生成一份格式规范的日报。场景设定数据源1legacy_sales.xls(旧系统导出的.xls文件)。数据源2new_sales.xlsx(新系统导出的.xlsx文件)。目标合并两个数据源清洗数据去除无效订单、格式化日期、统一产品名计算各产品总销售额和销售量最后生成一个包含汇总数据和柱状图的日报daily_summary_YYYYMMDD.xlsx。完整实现代码import os from datetime import datetime import xlrd from openpyxl import Workbook, load_workbook from openpyxl.styles import Font, Alignment, Border, Side, numbers from openpyxl.chart import BarChart, Reference def read_xls_with_xlrd(filepath): 使用xlrd读取.xls文件返回数据列表 data [] try: book xlrd.open_workbook(filepath) sheet book.sheet_by_index(0) for rx in range(1, sheet.nrows): # 跳过标题行 row [] for cx in range(sheet.ncols): cell sheet.cell(rx, cx) val cell.value # 处理日期 if cell.ctype 3: try: date_tuple xlrd.xldate_as_tuple(val, book.datemode) val datetime(*date_tuple[:3]).strftime(%Y-%m-%d) except: val str(val) row.append(val) data.append(row) except Exception as e: print(f读取 {filepath} 失败: {e}) return data def read_xlsx_with_openpyxl(filepath): 使用openpyxl读取.xlsx文件返回数据列表 data [] try: wb load_workbook(filepath, data_onlyTrue) # data_onlyTrue 获取计算后的值 ws wb.active # 假设第一行是表头 for row in ws.iter_rows(min_row2, values_onlyTrue): # 将行元组转换为列表方便处理 data.append(list(row)) except Exception as e: print(f读取 {filepath} 失败: {e}) return data def clean_and_merge_data(old_data, new_data): 清洗和合并数据 all_data [] product_name_mapping {ProdA: 产品A, ProdB: 产品B, 产品C: 产品C} # 产品名统一映射 # 处理旧数据 for row in old_data: # 清洗假设第2列是产品名第3列是销售额第4列是销售量 if len(row) 4 and row[2] and row[2] 0: # 简单过滤无效数据销售额0 product product_name_mapping.get(row[1], row[1]) # 统一产品名 cleaned_row [row[0], product, float(row[2]), int(row[3])] all_data.append(cleaned_row) # 处理新数据 for row in new_data: if len(row) 4 and row[2] and row[2] 0: product product_name_mapping.get(row[1], row[1]) cleaned_row [row[0], product, float(row[2]), int(row[3])] all_data.append(cleaned_row) return all_data def generate_summary_report(cleaned_data, output_path): 生成汇总报告 wb Workbook() ws wb.active ws.title 销售日报 # 1. 写入标题和表头 today_str datetime.now().strftime(%Y-%m-%d) ws[A1] f销售数据日报 ({today_str}) ws[A1].font Font(size14, boldTrue) ws.merge_cells(A1:D1) headers [日期, 产品, 销售额元, 销售量] for col, header in enumerate(headers, start1): cell ws.cell(row3, columncol, valueheader) cell.font Font(boldTrue) cell.alignment Alignment(horizontalcenter) # 设置边框 cell.border Border(leftSide(stylethin), rightSide(stylethin), topSide(stylethin), bottomSide(stylethin)) # 2. 写入清洗后的明细数据 current_row 4 for row_data in cleaned_data: for col, value in enumerate(row_data, start1): cell ws.cell(rowcurrent_row, columncol, valuevalue) cell.border Border(leftSide(stylethin), rightSide(stylethin), topSide(stylethin), bottomSide(stylethin)) # 如果是销售额设置数字格式为千位分隔符 if col 3: cell.number_format numbers.FORMAT_NUMBER_COMMA_SEPARATED1 current_row 1 # 3. 计算汇总按产品 from collections import defaultdict summary defaultdict(lambda: {sales: 0.0, quantity: 0}) for row in cleaned_data: product row[1] summary[product][sales] row[2] summary[product][quantity] row[3] # 4. 写入汇总区域 summary_start_row current_row 2 ws.cell(rowsummary_start_row, column1, value产品汇总).font Font(boldTrue, size12) summary_headers [产品, 总销售额元, 总销售量] for col, header in enumerate(summary_headers, start1): ws.cell(rowsummary_start_row1, columncol, valueheader).font Font(boldTrue) summary_row summary_start_row 2 for product, values in summary.items(): ws.cell(rowsummary_row, column1, valueproduct) ws.cell(rowsummary_row, column2, valuevalues[sales]).number_format numbers.FORMAT_NUMBER_COMMA_SEPARATED1 ws.cell(rowsummary_row, column3, valuevalues[quantity]) summary_row 1 # 5. 生成图表 chart BarChart() chart.type col chart.title 产品销售额对比 chart.y_axis.title 销售额元 chart.x_axis.title 产品 # 图表数据汇总表中的产品名和总销售额 data_ref Reference(ws, min_col2, min_rowsummary_start_row2, max_rowsummary_row-1) categories_ref Reference(ws, min_col1, min_rowsummary_start_row2, max_rowsummary_row-1) chart.add_data(data_ref, titles_from_dataFalse) chart.set_categories(categories_ref) # 将图表放在汇总表右侧 ws.add_chart(chart, fE{summary_start_row}) # 6. 调整列宽 for col in ws.columns: max_length 0 col_letter col[0].column_letter for cell in col: try: cell_length len(str(cell.value)) if cell_length max_length: max_length cell_length except: pass adjusted_width min(max_length 2, 50) # 设置最大宽度为50 ws.column_dimensions[col_letter].width adjusted_width # 7. 保存文件 wb.save(output_path) print(f报告已生成{output_path}) def main(): # 定义文件路径 legacy_file legacy_sales.xls new_file new_sales.xlsx output_file fdaily_summary_{datetime.now().strftime(%Y%m%d)}.xlsx # 检查输入文件是否存在 if not os.path.exists(legacy_file): print(f警告文件 {legacy_file} 不存在将跳过。) legacy_data [] else: legacy_data read_xls_with_xlrd(legacy_file) if not os.path.exists(new_file): print(f警告文件 {new_file} 不存在将跳过。) new_data [] else: new_data read_xlsx_with_openpyxl(new_file) if not legacy_data and not new_data: print(错误没有找到任何有效数据。) return # 清洗合并数据 cleaned_data clean_and_merge_data(legacy_data, new_data) print(f共清洗合并 {len(cleaned_data)} 条有效数据。) if cleaned_data: # 生成报告 generate_summary_report(cleaned_data, output_file) else: print(清洗后无有效数据未生成报告。) if __name__ __main__: main()这个案例综合运用了xlrd读取旧格式、openpyxl读取新格式、数据清洗、汇总计算、样式设置和图表生成。你可以将其设置为定时任务如使用Windows任务计划或Linux的cron实现真正的日报自动化。6. 常见问题排查与性能优化心得在实际使用中你肯定会遇到各种问题。这里我总结了一些高频问题和优化技巧。6.1 常见错误与解决方案问题现象可能原因解决方案openpyxl保存文件后用Excel打开提示“文件损坏”或格式错误。1. 代码中可能创建了无效的图表或样式对象。2. 单元格赋值了不支持的数据类型如自定义类实例。3. 文件路径包含中文或特殊字符保存时编码问题。1. 检查图表数据区域引用是否正确确保引用的单元格存在。2. 确保写入单元格的值是基本类型str, int, float, bool, None, datetime。3. 尝试使用纯英文路径和文件名。保存后用openpyxl重新读取一下看是否报错。xlrd读取.xlsx文件报错xlrd.biffh.XLRDError: Excel xlsx file; not supported。安装了新版xlrd2.0.0它只支持.xls。对于.xlsx文件改用openpyxl读取。如果需要兼容两种格式可以先判断文件扩展名。读取的日期变成了一个很大的数字如44774。Excel内部用数字存储日期库直接读出了这个数字。使用xlrd.xldate_as_tuple()转换对xlrd或确保openpyxl读取的单元格格式是日期格式其value会是datetime对象。公式单元格读出来是公式字符串如SUM(A1:A10)而不是计算结果。文件未被Excel计算过或者用openpyxl打开时未使用data_onlyTrue模式。加载工作簿时使用load_workbook(filename, data_onlyTrue)。注意如果文件是openpyxl创建且从未被Excel打开data_onlyTrue也读不到值。处理大文件时内存占用高速度慢。默认加载模式将整个工作簿载入内存。使用read_onlyTrue模式读取write_onlyTrue模式写入大文件。注意这两种模式功能有限制。合并单元格遍历时只有第一个单元格有值其他都是None。这是openpyxl的设计只有合并区域的左上角单元格存储值。遍历前先获取ws.merged_cells.ranges判断当前单元格是否在某个合并范围内如果是则去取该范围左上角单元格的值。6.2 性能优化与最佳实践最小化读写操作避免在循环内频繁保存工作簿wb.save()。所有操作在内存中完成最后一次性写入磁盘。善用iter_rows和iter_cols遍历大量单元格时使用这些生成器方法而不是直接访问ws[A1:Z10000]后者会立即生成所有单元格对象。批量样式设置如前文所示先定义好样式对象然后在循环外或通过批量操作应用比在循环内为每个单元格单独创建样式对象快得多。对于超大数据集考虑其他工具如果数据量极大数十万行以上且主要是进行数值计算和分析pandas是更好的选择它底层基于NumPy效率极高。pandas的read_excel和to_excel函数可以调用openpyxl或xlrd作为引擎。你可以用pandas处理分析再用openpyxl对结果进行精细的格式化和图表输出强强联合。文件路径处理使用os.path模块来处理文件路径保证跨平台兼容性。在打开文件前先用os.path.exists()检查文件是否存在。异常处理务必用try...except包裹文件打开、读取、保存等IO操作并给出明确的错误提示使脚本更健壮。6.3 一个实用的调试技巧当你写的脚本生成的Excel文件看起来不对劲时一个快速的方法是用openpyxl重新读取你刚创建的文件并打印出关键区域的内容和属性。def debug_worksheet(ws, range_strA1:D5): 打印指定区域单元格的值和格式用于调试 from openpyxl.utils import range_boundaries min_col, min_row, max_col, max_row range_boundaries(range_str.upper()) print(f调试区域 {range_str}:) for row in ws.iter_rows(min_rowmin_row, max_rowmax_row, min_colmin_col, max_colmax_col): for cell in row: print(f {cell.coordinate}: 值{cell.value}, 数据类型{cell.data_type}, 数字格式{cell.number_format}) print(- * 20) # 用法 wb load_workbook(my_output.xlsx) ws wb.active debug_worksheet(ws, A1:F3)掌握了openpyxl和xlrd你就拥有了自动化处理Excel任务的强大能力。从简单的数据提取到复杂的报表生成这些技能能极大提升你的工作效率。记住关键是多实践从解决自己实际工作中的一个小痛点开始逐步构建更复杂的自动化流程。本文还有配套的精品资源点击获取