1. 创始时间与作者
2. 官方资源
GitHub 地址:https://github.com/soxhub/openpyxl
PyPI 地址:https://pypi.org/project/openpyxl/
文档地址:https://openpyxl.readthedocs.io/
官网地址:https://openpyxl.org/
3. 核心功能
4. 应用场景
1. 数据报表生成
from openpyxl import Workbookfrom openpyxl.styles import Font, Alignment# 创建工作簿wb = Workbook()ws = wb.activews.title = "销售报表"# 添加标题ws['A1'] = "2023年销售数据"ws['A1'].font = Font(bold=True, size=16)ws.merge_cells('A1:E1')# 添加表头headers = ["产品", "季度1", "季度2", "季度3", "季度4"]for col, header in enumerate(headers, 1):cell = ws.cell(row=2, column=col, value=header)cell.font = Font(bold=True)cell.alignment = Alignment(horizontal='center')# 添加数据data = [ ["手机", 12500, 14200, 16800, 19500], ["笔记本", 8500, 9200, 10500, 12800], ["平板", 6800, 7200, 8900, 10200]]for row_idx, row_data in enumerate(data, 3):for col_idx, value in enumerate(row_data, 1):ws.cell(row=row_idx, column=col_idx, value=value)# 添加汇总公式for row_idx in range(3, 6):ws.cell(row=row_idx, column=6, value=f"=SUM(B{row_idx}:E{row_idx})")# 保存文件wb.save("sales_report.xlsx")2. 大数据集处理
from openpyxl import load_workbookfrom openpyxl.utils import get_column_letterdef process_large_excel(file_path, output_path):# 打开工作簿(只读模式优化内存)wb = load_workbook(filename=file_path, read_only=True)ws = wb.active# 创建新工作簿new_wb = Workbook()new_ws = new_wb.activenew_ws.title = "处理结果"# 复制表头for row in ws.iter_rows(min_row=1, max_row=1):for cell in row:new_ws[cell.coordinate].value = cell.value# 处理数据(10万行示例)row_count = 0for row in ws.iter_rows(min_row=2, values_only=True):if row_count%1000 == 0:print(f"处理进度: {row_count}行")# 数据处理逻辑processed_row = [row[0], row[1] *1.1 if row[1] else 0, # 增加10%f"={get_column_letter(2)}{row_count+2}*0.9"# 公式计算 ]new_ws.append(processed_row)row_count += 1# 每1000行保存一次(防止内存溢出)if row_count%1000 == 0:new_wb.save(output_path)# 调整列宽for col in new_ws.columns:max_length = 0column = col[0].column_letterfor cell in col:try:if len(str(cell.value)) >max_length:max_length = len(str(cell.value))except:passadjusted_width = (max_length+2)new_ws.column_dimensions[column].width = adjusted_widthnew_wb.save(output_path)process_large_excel("big_data.xlsx", "processed_data.xlsx")3. 财务报表自动化
from openpyxl import load_workbookfrom openpyxl.chart import BarChart, Referencedef generate_financial_report(template_path, output_path, data):# 加载模板wb = load_workbook(template_path)ws = wb["财务报表"]# 填充数据ws['C5'] = data['revenue']ws['C6'] = data['cost']ws['C7'] = f"=C5-C6"# 毛利ws['C8'] = data['expenses']ws['C9'] = f"=C7-C8"# 净利# 添加月度数据months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]for i, month in enumerate(months, start=3):ws.cell(row=15, column=i, value=month)ws.cell(row=16, column=i, value=data['monthly_revenue'][i-3])ws.cell(row=17, column=i, value=data['monthly_cost'][i-3])# 创建图表chart = BarChart()chart.type = "col"chart.style = 10chart.title = "月度收入与成本"chart.y_axis.title = "金额 (万元)"chart.x_axis.title = "月份"data_ref = Reference(ws, min_col=3, min_row=16, max_col=8, max_row=17)cats = Reference(ws, min_col=3, min_row=15, max_col=8)chart.add_data(data_ref, titles_from_data=True)chart.set_categories(cats)# 添加图表到工作表ws.add_chart(chart, "B20")# 保护工作表ws.protection.sheet = Truews.protection.password = 'finance2023'# 保存报告wb.save(output_path)# 使用示例financial_data = {'revenue': 12500000,'cost': 7800000,'expenses': 3200000,'monthly_revenue': [980, 1020, 1100, 1150, 1250, 1300],'monthly_cost': [620, 650, 680, 700, 750, 780]}generate_financial_report("report_template.xlsx", "Q2_financial_report.xlsx", financial_data)4. 数据清洗与转换
from openpyxl import load_workbookimport redef clean_excel_data(input_path, output_path):wb = load_workbook(input_path)ws = wb.active# 清理电话号码格式phone_pattern = re.compile(r'(\d{3})\D*(\d{4})\D*(\d{4})')for row in ws.iter_rows(min_row=2, min_col=3, max_col=3):for cell in row:if cell.value and isinstance(cell.value, str):match = phone_pattern.search(cell.value)if match:cell.value = f"{match.group(1)}-{match.group(2)}-{match.group(3)}"# 标准化日期格式for row in ws.iter_rows(min_row=2, min_col=4, max_col=4):for cell inrow:if isinstance(cell.value, str):# 尝试转换各种日期格式try:cell.value = cell.value.replace('/', '-').replace('年', '-').replace('月', '-').replace('日', '')except:pass# 删除空行rows_to_delete = []for idx, row in enumerate(ws.iter_rows(min_row=2), start=2):if all(cell.value is None or cell.value == "" for cell in row):rows_to_delete.append(idx)for idx in sorted(rows_to_delete, reverse=True):ws.delete_rows(idx)# 数据验证email_pattern = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')for row in ws.iter_rows(min_row=2, min_col=2, max_col=2):for cell in row:if cell.value and not email_pattern.match(cell.value):# 标记无效邮箱cell.font = Font(color="FF0000")cell.comment = "无效邮箱格式"wb.save(output_path)clean_excel_data("raw_data.xlsx", "cleaned_data.xlsx")5. 底层逻辑与技术原理
模块架构
关键技术实现
XML 处理:
文件结构:
Excel 文件作为 ZIP 存档处理
包含多个 XML 文件(工作表、样式、共享字符串等)
目录结构解析:_rels, docProps, xl
内存优化:
只读模式:逐行读取不加载整个文件
写优化模式:延迟写入直到保存
共享字符串表:减少重复字符串内存占用
公式处理:
支持读取计算公式结果
支持写入公式(不计算)
使用 data_only=True 读取计算结果
6. 安装与配置
基础安装
pip install openpyxl
可选依赖
# 安装lxml加速XML处理pip install lxml# 安装Pillow支持图像处理pip install pillow
环境要求
| 组件 | 最低要求 | 推荐配置 |
|---|
| Python | 3.6+ | 3.8+ |
| 内存 | 128MB | 1GB+(大文件处理) |
| 磁盘空间 | 无特殊要求 | 足够存储Excel文件 |
兼容性说明
# 检查文件格式兼容性from openpyxl import Workbookwb = Workbook()# 支持的文件格式print("支持保存格式:", wb.supported_formats)# 输出: ['xlsx', 'xlsm', 'xltx', 'xltm']# 检查功能支持print("是否支持图表:", hasattr(wb, 'create_chart'))print("是否支持图像:", hasattr(wb, 'add_image'))7. 核心API详解
工作簿操作
| 方法 | 描述 | 示例 |
|---|
Workbook() | 创建新工作簿 | wb = Workbook() |
load_workbook() | 加载现有文件 | wb = load_workbook('data.xlsx') |
save() | 保存工作簿 | wb.save('output.xlsx') |
active | 获取活动工作表 | ws = wb.active |
create_sheet() | 创建工作表 | ws = wb.create_sheet('新表') |
remove() | 删除工作表 | wb.remove(ws) |
工作表操作
| 方法 | 描述 | 示例 |
|---|
cell() | 获取单元格 | cell = ws.cell(row=1, column=1) |
iter_rows() | 行迭代器 | for row in ws.iter_rows(min_row=2): |
append() | 添加行数据 | ws.append(['A', 'B', 'C']) |
merge_cells() | 合并单元格 | ws.merge_cells('A1:D1') |
freeze_panes | 冻结窗格 | ws.freeze_panes = 'B2' |
add_table() | 添加表格 | ws.add_table(table) |
单元格操作
| 属性/方法 | 描述 | 示例 |
|---|
value | 单元格值 | cell.value = 42 |
number_format | 数字格式 | cell.number_format = '0.00%' |
font | 字体样式 | cell.font = Font(bold=True) |
fill | 填充样式 | cell.fill = PatternFill(fill_type='solid', fgColor='FF0000') |
border | 边框样式 | cell.border = Border(left=Side(style='thin')) |
comment | 单元格批注 | cell.comment = Comment('重要数据', '系统') |
8. 高级用法
1. 条件格式
from openpyxl import Workbookfrom openpyxl.styles import PatternFillfrom openpyxl.formatting.rule import CellIsRulewb = Workbook()ws = wb.active# 添加示例数据for i in range(1, 11):ws.append([i, i*10, i*100])# 创建条件格式 - 值大于500red_fill = PatternFill(start_color='FFC7CE', end_color='FFC7CE', fill_type='solid')rule = CellIsRule(operator='greaterThan', formula=['500'], fill=red_fill)ws.conditional_formatting.add('C1:C10', rule)# 创建条件格式 - 数据条from openpyxl.formatting.rule import DataBarRuledata_bar_rule = DataBarRule(start_type='min', end_type='max', color="FF638EC6", showValue=True)ws.conditional_formatting.add('B1:B10', data_bar_rule)wb.save('conditional_formatting.xlsx')2. 数据验证
from openpyxl import Workbookfrom openpyxl.worksheet.datavalidation import DataValidationwb = Workbook()ws = wb.active# 创建下拉列表验证dv = DataValidation(type="list", formula1='"选项A,选项B,选项C"', showDropDown=True)dv.error = '输入无效'dv.errorTitle = '无效输入'dv.prompt = '请从列表中选择'dv.promptTitle = '选择选项'ws.add_data_validation(dv)dv.add('A1:A10') # 应用验证区域# 创建日期验证date_dv = DataValidation(type="date", operator="between", formula1="2023-01-01", formula2="2023-12-31")ws.add_data_validation(date_dv)date_dv.add('B1:B10')# 创建自定义公式验证formula_dv = DataValidation(type="custom", formula1="=AND(ISNUMBER(C1), C1>=0, C1<=100)")formula_dv.error = '请输入0-100之间的数字'ws.add_data_validation(formula_dv)formula_dv.add('C1:C10')wb.save('data_validation.xlsx')3. 高级图表
from openpyxl import Workbookfrom openpyxl.chart import BarChart, Reference, Seriesfrom openpyxl.chart.label import DataLabelListwb = Workbook()ws = wb.active# 添加数据data = [ ['产品', 'Q1', 'Q2', 'Q3', 'Q4'], ['手机', 10000, 12000, 15000, 18000], ['笔记本', 8000, 9000, 11000, 13000], ['平板', 6000, 7000, 8500, 10000]]for row in data:ws.append(row)# 创建组合图表chart = BarChart()chart.type = "col"chart.style = 10chart.title = "季度销售报告"chart.y_axis.title = "销量"chart.x_axis.title = "产品"# 添加数据系列data_ref = Reference(ws, min_col=2, min_row=1, max_col=5, max_row=4)categories = Reference(ws, min_col=1, min_row=2, max_row=4)chart.add_data(data_ref, titles_from_data=True)chart.set_categories(categories)# 添加数据标签chart.dataLabels = DataLabelList()chart.dataLabels.showVal = True# 添加趋势线from openpyxl.chart.trendline import Trendlinefor series in chart.series:trendline = Trendline(trendlineType="linear", dispRSqr=True)series.trendline = trendline# 将图表添加到工作表ws.add_chart(chart, "A10")wb.save("advanced_chart.xlsx")4. 宏与VBA支持
from openpyxl import Workbookfrom openpyxl import load_workbookfrom openpyxl.utils import get_column_letterimport os# 创建带宏的工作簿wb = Workbook()ws = wb.active# 添加按钮宏vba_code = """Sub ButtonClick() MsgBox "按钮被点击!" Range("A1").Value = "Hello from VBA"End Sub"""# 添加VBA模块(需要安装pywin32)try:from openpyxl import Workbookwb = Workbook()ws = wb.active# 添加VBA项目wb.vba_project = vba_code# 添加按钮并绑定宏from openpyxl.drawing.spreadsheet_drawing import SpreadsheetDrawingfrom openpyxl.worksheet.controls import ControlPropertiesfrom openpyxl.worksheet.controls import FormControldrawing = SpreadsheetDrawing()ctrl_props = ControlProperties(objectName="Button1",anchor="A1:B2",macro="ButtonClick",text="点击我" )form_control = FormControl(control_properties=ctrl_props)drawing.controls.control.append(form_control)ws.add_drawing(drawing)wb.save("macro_enabled.xlsm")except ImportError:print("需要安装pywin32以支持VBA功能")# 替代方案:使用外部VBA文件wb.save("without_macro.xlsx")# 手动添加VBA代码到生成的Excel文件9. 最佳实践
处理大文件
# 使用只读模式读取大文件wb = load_workbook('large_file.xlsx', read_only=True)# 使用只写模式创建大文件wb = Workbook(write_only=True)ws = wb.create_sheet()# 逐行添加数据for row in large_data:ws.append(row)wb.save('large_output.xlsx')性能优化
# 禁用不必要的功能提升性能wb = load_workbook('file.xlsx', data_only=True, keep_vba=False)# 批量操作单元格for row in ws.iter_rows():for cell in row:process_cell(cell)错误处理
try:wb = load_workbook('file.xlsx')except FileNotFoundError:print("文件不存在")except KeyError as e:print(f"工作表不存在: {e}")except Exception as e:print(f"未知错误: {e}")内存管理
# 显式释放内存del wsdel wb._sheets[:] # 清除工作表引用import gcgc.collect()
10. 与同类工具对比
| 特性 | openpyxl | xlrd/xlwt | pandas | xlsxwriter |
|---|
| 读写支持 | ✅读写 | ✅读/写 | ✅读/写 | ✅写 |
| 文件格式 | xlsx/xlsm | xls/xlsx | xls/xlsx | xlsx |
| 图表支持 | ✅ | ❌ | ❌ | ✅ |
| 样式控制 | ✅高级 | ✅基础 | ✅基础 | ✅高级 |
| 公式支持 | ✅ | ✅ | ❌ | ✅ |
| 大文件支持 | ✅优化 | ❌ | ✅ | ✅ |
| 依赖项 | 轻量 | 轻量 | 重 | 轻量 |
| 学习曲线 | 中等 | 简单 | 简单 | 中等 |
11. 企业级应用案例
金融行业
电子商务
科学研究
实验数据导出工具
科研报告模板填充
数据可视化图表生成
教育领域
制造业
总结
openpyxl 是 Python 生态中最强大的 Excel 处理库,核心价值在于:
完整功能支持:读写、格式、图表、公式等全面覆盖
现代格式兼容:完美支持 xlsx/xlsm 等 Office Open XML 格式
企业级稳定性:经过十多年发展和企业应用验证
活跃社区支持:持续更新维护,问题响应迅速
技术亮点:
基于 XML 的 Excel 文件格式解析
内存优化的大文件处理能力
丰富的样式和格式控制
强大的图表和数据可视化支持
灵活的数据验证和条件格式
适用场景:
Excel 报表自动化生成
数据清洗与转换工具
财务分析报告系统
科学实验数据处理
业务数据导出导入
Excel 模板填充系统
安装使用:
pip install openpyxl
学习资源:
官方文档:https://openpyxl.readthedocs.io
教程示例:https://openpyxl.readthedocs.io/en/stable/usage.html
实战项目:https://github.com/openpyxl/openpyxl/tree/master/examples
截至2023年,openpyxl 在 PyPI 的月下载量超过 1000万次,是 Python 处理 Excel 文件的标准解决方案。项目遵循 MIT 开源协议,可免费用于商业和非商业项目。