Python深度挖掘:openpyxl和pandas的使用详细

Python深度挖掘:openpyxl 和 pandas 的使用详细对比与实战(2026 最新版,基于 pandas 3.0.1 + openpyxl 3.1.5)

这是 Python 数据处理领域最经典的组合
很多人只知道 pd.read_excel(),但真正做到美观报表 + 高效分析,必须二者结合

下面一次性讲透:什么时候用哪个?如何单独用?如何完美结合? 全部配完整可运行代码。

1. pandas vs openpyxl 核心对比(面试/选型必看)

维度pandas(数据分析神器)openpyxl(Excel 精细操控神器)推荐场景
核心定位DataFrame/Series 操作(过滤、聚合、分组、透视)直接操作 Excel 单元格、样式、公式、图表、合并单元格
读写性能超快(向量化,百万级秒级)较慢(逐行/逐单元格)pandas 胜
格式控制基础(列宽、冻结窗格、简单样式)极强(字体、颜色、边框、条件格式、数据验证)openpyxl 完胜
支持功能数据清洗、统计、机器学习无缝衔接图表、图片、宏、保护工作表、打印设置
内存占用较高(全加载进内存)较低(支持迭代读取)大文件选 openpyxl
学习曲线低(几行代码搞定)中高(需要理解 Workbook、Worksheet、Cell)
底层引擎默认用 openpyxl(xlsx)或 xlsxwriter原生支持 xlsx/xlsm

一句话结论(2026 年最佳实践):

  • 纯数据处理 → 只用 pandas
  • 需要漂亮报表(颜色、标题、图表、合并)→ pandas + openpyxl 结合
  • 超大文件(>50万行) → 先 openpyxl 迭代读取,再转 pandas

2. pandas 读写 Excel 详解(2026 最新参数)

读取(read_excel)—— 最常用

import pandas as pd

# 基础读取(2026 年推荐写法)
df = pd.read_excel(
    'data.xlsx',
    sheet_name='Sheet1',          # 可传列表读取多 sheet
    header=0,                     # 第几行做列名(None=无表头)
    usecols='A:C',                # 只读 A-C 列(超快!)
    dtype={'id': 'int64', 'sales': 'float64'},  # 指定类型
    parse_dates=['date'],         # 自动转日期
    engine='openpyxl',            # 明确指定(pandas 3.0 默认)
    engine_kwargs={'data_only': True},  # 只读计算结果,不读公式
    dtype_backend='pyarrow'       # pandas 3.0+ 超快后端(推荐!)
)

print(df.head())
print(df.dtypes)

高级技巧

  • nrows=1000:只读前 N 行(测试用)
  • skiprows=range(1,10):跳过前 9 行
  • na_values=['N/A', 'NULL']:自定义空值

写入(to_excel)—— 多 sheet 神器

with pd.ExcelWriter('report.xlsx', engine='openpyxl') as writer:
    df1.to_excel(writer, sheet_name='销售数据', index=False)
    df2.to_excel(writer, sheet_name='汇总', index=False, startrow=5)  # 从第6行开始

    # 2026 新参数
    workbook = writer.book                    # 获取 openpyxl 对象(关键!)
    worksheet = writer.sheets['销售数据']
    worksheet.freeze_panes = 'A2'             # 冻结首行

3. openpyxl 低级操控详解(pandas 做不到的)

基础读写

from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter

# 读取(支持公式、样式)
wb = load_workbook('data.xlsx', data_only=True)  # data_only=True 只读结果
ws = wb['Sheet1']

# 读取单元格
print(ws['A1'].value)
print(ws.cell(row=2, column=1).value)

# 新建文件
wb = Workbook()
ws = wb.active
ws.title = '测试报表'

ws['A1'] = '销售额报表'
ws['A1'].font = Font(name='微软雅黑', size=14, bold=True, color='FFFFFF')
ws['A1'].fill = PatternFill('solid', fgColor='366092')
ws['A1'].alignment = Alignment(horizontal='center', vertical='center')

高级样式 + 图表 + 合并单元格

# 边框
thin = Side(border_style='thin', color='000000')
ws['A2'].border = Border(top=thin, left=thin, right=thin, bottom=thin)

# 列宽自适应(2026 常用)
for col in ws.columns:
    max_length = 0
    column = col[0].column_letter
    for cell in col:
        if cell.value:
            max_length = max(max_length, len(str(cell.value)))
    ws.column_dimensions[column].width = max_length + 2

# 插入图表(超级实用)
from openpyxl.chart import BarChart, Reference, Series

chart = BarChart()
chart.title = '月度销售额'
chart.y_axis.title = '金额'
chart.x_axis.title = '月份'

data = Reference(ws, min_col=2, min_row=1, max_row=13, max_col=2)
cats = Reference(ws, min_col=1, min_row=2, max_row=13)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, 'D2')

4. 王道:pandas + openpyxl 完美结合(生产必备)

import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font

# 1. 用 pandas 生成数据
df = pd.DataFrame({...})

# 2. 写入 + 获取 openpyxl 对象
with pd.ExcelWriter('final_report.xlsx', engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name='数据', index=False)

    # 关键:拿到 workbook 和 worksheet
    wb = writer.book
    ws = writer.sheets['数据']

# 3. 用 openpyxl 美化(pandas 无法做到)
ws['A1'].font = Font(bold=True, size=16)
ws.merge_cells('A1:F1')                    # 合并标题
ws.freeze_panes = 'A2'

# 条件格式(pandas 做不到)
from openpyxl.formatting.rule import Rule
from openpyxl.styles.differential import DifferentialStyle
red_fill = PatternFill(start_color='FF0000', fill_type='solid')
dxf = DifferentialStyle(fill=red_fill)
rule = Rule(type='expression', dxf=dxf, formula=['$B2<0'])
ws.conditional_formatting.add('B2:B100', rule)

wb.save('final_report.xlsx')

5. 性能优化与大文件处理(2026 实战经验)

  • 百万行以上:不要用 pd.read_excel() 全加载!用 openpyxl 迭代读取:
  wb = load_workbook('big.xlsx', read_only=True)
  ws = wb.active
  for row in ws.iter_rows(min_row=2, values_only=True):
      # 处理每一行
  • 加速 pandasdtype_backend='pyarrow' + engine_kwargs={'keep_vba': True}
  • 多进程并行:用 dask 或手动分 sheet

6. 常见坑 & 最佳实践(避坑指南)

  1. pandas 默认不保存样式 → 必须结合 openpyxl
  2. to_excel 会覆盖文件 → 用 if_sheet_exists='replace'(pandas 2.0+)
  3. 日期格式乱码parse_dates + date_format
  4. 大文件内存爆炸chunksize 参数(read_excel 不支持?用 openpyxl + 分批转 df)
  5. 公式不生效data_only=False 读取时保留公式

推荐目录结构(工程化):

excel_utils/
├── pandas_utils.py     # 读写 + 基础处理
├── openpyxl_styles.py  # 样式模板函数
├── report_generator.py # 主报表生成
└── templates/          # 模板文件

7. 真实项目案例(直接复制可用)

自动生成月度销售报表(含颜色、图表、汇总):

  • pandas 做数据清洗 + 透视表
  • openpyxl 加标题、条件格式、柱状图、自动列宽
  • 一键生成 50 个分公司报表

掌握上面内容,你已经超越 95% 的 Python 数据工程师!

需要我立刻给你:

  • 完整可运行项目模板(GitHub 风格)
  • 100万行大文件处理方案
  • openpyxl 样式库封装(一键美化)
  • pandas 3.0 新特性专讲(pyarrow + nullable 类型)

直接回复关键词即可~ 这篇背熟后,Excel 自动化题面试直接满分!🚀

文章已创建 5041

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部