我在你左右 發表於 2026-1-5 09:26:24

Python办公自动化之openpyxl使用与避坑全面指南

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 什么是 openpyxl?</a></li><li><a href="#_label1">2. 准备工作</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 安装库</a></li><li><a href="#_lab2_1_1">2.2 理解 Excel 的三大核心概念</a></li></ul><li><a href="#_label2">3. 实战演练:由浅入深</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">场景一:读取现有的 Excel 文件</a></li><li><a href="#_lab2_2_3">场景二:创建并写入新的 Excel 文件</a></li><li><a href="#_lab2_2_4">场景三:美化与样式(进阶)</a></li></ul><li><a href="#_label3">4. 新手常见的&ldquo;坑&rdquo;与避坑指南</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_5">1. 索引从 1 开始,而不是 0</a></li><li><a href="#_lab2_3_6">2..xls和.xlsx的区别</a></li><li><a href="#_lab2_3_7">3. 公式读取问题</a></li><li><a href="#_lab2_3_8">4. 忘记保存</a></li></ul><li><a href="#_label4">5. 总结与下一步</a></li><ul class="second_class_ul"></ul></ul></div><p>在现代职场中,Excel 无疑是数据处理的霸主。然而,面对成千上万行的数据、每日重复的报表生成任务,手动操作不仅效率低下,而且容易出错。</p>
<p><strong>如果你曾梦想有一只&ldquo;看不见的手&rdquo;帮你自动处理 Excel 表格,那么 Python 的 </strong><code>openpyxl</code><strong> 库就是你的最佳搭档。</strong></p>
<p>本指南专为编程新手设计,将带你从零开始,系统掌握使用 Python 读写、修改和格式化 Excel 文件的核心技能。</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 什么是 openpyxl?</h2>
<p><code>openpyxl</code> 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。</p>
<p><strong>为什么选择它?</strong></p>
<ul><li><strong>无需安装 Excel:</strong> 即使电脑上没装 Office,也能处理表格。</li><li><strong>不仅是读取:</strong> 它能修改格式、插入公式、绘制图表。</li><li><strong>自动化神器:</strong> 它可以将原本需要几小时的人工操作缩短至几秒钟。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>2. 准备工作</h2>
<p>在开始之前,请确保你已经安装了 Python 环境。</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 安装库</h3>
<p>打开你的终端(Terminal 或 CMD),输入以下命令安装 <code>openpyxl</code>:</p>
<div class="jb51code"><pre class="brush:bash;">pip install openpyxl
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 理解 Excel 的三大核心概念</h3>
<p>在使用代码操作 Excel 之前,我们需要建立一个心理模型,这与我们手动操作 Excel 是一致的:</p>
<ul><li><strong>Workbook(工作簿):</strong> 整个 Excel 文件(例如 <code>data.xlsx</code>)。</li><li><strong>Worksheet(工作表):</strong> 工作簿下方的标签页(例如 <code>Sheet1</code>, <code>财务表</code>)。</li><li><strong>Cell(单元格):</strong> 存储数据的最小方格(例如 <code>A1</code>, <code>B2</code>)。</li></ul>
<p><strong>层级关系:</strong> Workbook -&gt; Worksheet -&gt; Cell</p>
<p class="maodian"><a name="_label2"></a></p><h2>3. 实战演练:由浅入深</h2>
<p>我们将通过三个场景来掌握核心功能。</p>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>场景一:读取现有的 Excel 文件</h3>
<p>假设你有一个名为 <code>sample.xlsx</code> 的文件,我们想读取里面的数据。</p>
<div class="jb51code"><pre class="brush:py;">from openpyxl import load_workbook

# 1. 加载工作簿
# data_only=True 表示读取公式计算后的值,而不是公式本身
wb = load_workbook('sample.xlsx', data_only=True)

# 2. 选择工作表
# 方式A:获取当前活跃的表(通常是第一个)
sheet = wb.active
# 方式B:根据表名获取
# sheet = wb['Sheet1']

# 3. 读取特定单元格的值
print(f"A1单元格的值是: {sheet['A1'].value}")

# 4. 遍历读取多行数据
print("--- 开始遍历数据 ---")
# iter_rows 允许我们指定读取的范围
for row in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=3):
    # row 是一个包含单元格对象的元组
    row_data =
    print(row_data)

# 5. 关闭工作簿(虽然 Python 会自动回收,但显式关闭是好习惯)
wb.close()
</pre></div>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>场景二:创建并写入新的 Excel 文件</h3>
<p>现在,我们来从头创建一个报表。</p>
<div class="jb51code"><pre class="brush:py;">from openpyxl import Workbook

# 1. 创建一个新的工作簿对象(注意:不需要 load_workbook)
wb = Workbook()

# 2. 获取活跃的工作表
ws = wb.active
ws.title = "销售统计"# 修改表名

# 3. 写入表头
headers = ['日期', '产品', '销售额']
ws.append(headers)# append 方法会将列表数据添加到当前数据的下一行

# 4. 写入数据
data = [
    ['2023-10-01', '键盘', 500],
    ['2023-10-01', '鼠标', 120],
    ['2023-10-02', '显示器', 1500]
]

for row in data:
    ws.append(row)

# 5. 直接修改特定单元格
ws['D1'] = "备注"
ws['D2'] = "热销"

# 6. 保存文件
# 注意:如果文件已存在,这步操作会直接覆盖原文件
wb.save('sales_report.xlsx')
print("文件已成功生成!")
</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>场景三:美化与样式(进阶)</h3>
<p>仅仅只有数据是不够的,专业的报表需要字体、颜色和对齐方式。</p>
<div class="jb51code"><pre class="brush:py;">from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment

wb = Workbook()
ws = wb.active

# 写入测试数据
ws['A1'] = "季度总结报告"
ws.merge_cells('A1:C1')# 合并单元格

# --- 设置样式 ---

# 1. 定义字体:加粗,大小14,蓝色
title_font = Font(name='微软雅黑', size=14, bold=True, color="0000FF")

# 2. 定义背景填充:黄色
yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")

# 3. 定义对齐方式:水平居中,垂直居中
center_align = Alignment(horizontal='center', vertical='center')

# --- 应用样式 ---
cell = ws['A1']
cell.font = title_font
cell.fill = yellow_fill
cell.alignment = center_align

wb.save('styled_report.xlsx')
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 新手常见的&ldquo;坑&rdquo;与避坑指南</h2>
<p>在使用 <code>openpyxl</code> 的过程中,初学者经常会遇到以下问题:</p>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>1. 索引从 1 开始,而不是 0</h3>
<p>在 Python 的列表(List)中,第一个元素的索引是 <code>0</code>。但在 <code>openpyxl</code> 中,Excel 的行(Row)和列(Column)都是从 <strong>1</strong> 开始的。</p>
<ul><li><strong>错误:</strong> <code>sheet.cell(row=0, column=0)</code></li><li><strong>正确:</strong> <code>sheet.cell(row=1, column=1)</code> (代表 A1)</li></ul>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>2..xls和.xlsx的区别</h3>
<p><code>openpyxl</code> <strong>不支持</strong> 旧版的 <code>.xls</code> 格式(Excel 97-2003)。</p>
<p><strong>解决方案:</strong> 如果你需要处理 <code>.xls</code> 文件,请先将其另存为 <code>.xlsx</code>,或者使用另一个库 <code>xlrd</code>(但 <code>xlrd</code> 新版也逐渐停止支持 <code>.xlsx</code>,建议统一转换为 <code>.xlsx</code> 处理)。</p>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>3. 公式读取问题</h3>
<p>当你读取一个包含公式的单元格(如 <code>=SUM(A1:A5)</code>)时:</p>
<ul><li>默认情况下,<code>openpyxl</code> 会读取到字符串 <code>&quot;=SUM(A1:A5)&quot;</code>。</li><li><strong>解决方案:</strong> 在加载文件时使用 <code>load_workbook(&#39;file.xlsx&#39;, data_only=True)</code>,这样读取到的就是计算后的数字结果。<strong>注意:</strong> 使用此模式保存文件后,公式可能会丢失,变成纯数值。通常建议读取用 <code>data_only=True</code>,写入时避免使用该模式覆盖原文件。</li></ul>
<p class="maodian"><a name="_lab2_3_8"></a></p><h3>4. 忘记保存</h3>
<p>所有的修改都在内存中进行,直到你执行 <code>wb.save(&#39;filename.xlsx&#39;)</code> 之前,硬盘上的文件不会有任何变化。</p>
<p class="maodian"><a name="_label4"></a></p><h2>5. 总结与下一步</h2>
<p>恭喜你!你已经掌握了 Python 操作 Excel 的核心技能。</p>
<p><strong>回顾一下我们学到的内容:</strong></p>
<ul><li><strong>加载与创建:</strong> 使用 <code>load_workbook</code> 和 <code>Workbook</code>。</li><li><strong>读写数据:</strong> 使用 <code>sheet[&#39;A1&#39;]</code> 定位,使用 <code>append</code> 批量写入。</li><li><strong>样式美化:</strong> 使用 <code>Font</code>, <code>PatternFill</code>, <code>Alignment</code> 让表格更专业。</li></ul>
<p><strong>下一步建议:</strong>尝试找一个你工作中真实的 Excel 任务(比如合并三个表格的数据),试着用 Python 脚本来完成它。刚开始写代码可能会比手动操作慢,但一旦脚本写好,以后成百上千次的操作都将瞬间完成。</p>
頁: [1]
查看完整版本: Python办公自动化之openpyxl使用与避坑全面指南