Python 自动化 Excel 修改已有单元格内容详细教程
在实际工作中,我们经常需要修改已有的Excel文件,比如更新数据、修正错误、批量替换内容等。Python提供了非常方便的方法来修改Excel单元格内容,本文将详细介绍各种修改场景的实现方法,包含完整代码示例和最佳实践。
一、环境准备
1.1 安装依赖库
pip install openpyxl pandas
1.2 注意事项
⚠️ 重要提醒:
1. 修改文件前一定要备份原文件,避免修改出错导致数据丢失
2. 不要修改正在打开的Excel文件,会导致保存失败
3. 大文件修改建议先复制一份,在副本上修改,确认无误后再替换原文件
4. 带密码保护的Excel文件需要先解密才能修改
二、基础修改操作
2.1 使用openpyxl修改单个单元格
openpyxl是修改Excel最常用的库,支持精细控制:
from openpyxl import load_workbook
# 加载已有的Excel文件
wb = load_workbook("员工信息.xlsx")
# 选择要修改的工作表,三种方式:
ws = wb.active # 选择当前活动的工作表
ws = wb["员工表"] # 通过工作表名称选择
ws = wb.worksheets[0] # 通过索引选择,第一个工作表索引为0
# 修改单元格内容,两种方式:
# 方式1:通过单元格坐标
ws["C2"] = "2023-06-01" # 修改C2单元格的入职日期
ws["D2"] = 16000 # 修改D2单元格的工资
# 方式2:通过行号列号(行号从1开始,列号从1开始)
ws.cell(row=2, column=4, value=16000) # 等价于ws["D2"] = 16000
# 保存修改
wb.save("员工信息_修改后.xlsx")
print("✅ 单元格修改完成!")
2.2 修改多个单元格
批量修改指定单元格:
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 需要修改的单元格:坐标:新值
modify_cells = {
"D2": 16000, # 张三工资调整为16000
"D3": 13000, # 李四工资调整为13000
"E2": "A+", # 张三绩效调整为A+
"E3": "A" # 李四绩效调整为A
}
for cell_coord, new_value in modify_cells.items():
ws[cell_coord] = new_value
wb.save("员工信息_批量修改.xlsx")
print("✅ 多个单元格修改完成!")
2.3 修改整行/整列
from openpyxl import load_workbook
wb = load_workbook("销售数据.xlsx")
ws = wb["1月销售"]
# 修改第3行所有数据
new_row_data = ["2026-01-03", "华北区", "王五", "产品A", 18000, 5400]
for col_idx, value in enumerate(new_row_data, 1):
ws.cell(row=3, column=col_idx, value=value)
# 修改第5列(销售额列)所有数据,统一上涨10%
for row in range(2, ws.max_row + 1): # 从第2行开始,跳过表头
old_value = ws.cell(row=row, column=5).value
if isinstance(old_value, (int, float)):
new_value = old_value * 1.1
ws.cell(row=row, column=5, value=new_value)
wb.save("销售数据_修改后.xlsx")
print("✅ 整行整列修改完成!")
三、按条件修改单元格
实际工作中经常需要根据条件批量修改符合要求的单元格。
3.1 简单条件修改
比如给绩效为A的员工工资涨10%:
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 遍历所有行(跳过表头)
for row in range(2, ws.max_row + 1):
performance = ws.cell(row=row, column=5).value # E列是绩效
salary = ws.cell(row=row, column=4).value # D列是工资
if performance == "A" and isinstance(salary, (int, float)):
new_salary = salary * 1.1
ws.cell(row=row, column=4, value=new_salary)
# 可以加个备注
ws.cell(row=row, column=6, value="2026年3月普涨10%")
wb.save("员工信息_普涨后.xlsx")
print("✅ 按条件修改完成!")
3.2 多条件修改
多个条件同时满足才修改:
from openpyxl import load_workbook
from datetime import datetime
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 给入职满3年且绩效为A的员工涨20%
current_year = datetime.now().year
for row in range(2, ws.max_row + 1):
hire_date = ws.cell(row=row, column=3).value # C列是入职日期
performance = ws.cell(row=row, column=5).value # E列是绩效
salary = ws.cell(row=row, column=4).value # D列是工资
# 转换日期格式
if isinstance(hire_date, str):
hire_year = int(hire_date.split("-")[0])
else:
hire_year = hire_date.year
work_years = current_year - hire_year
if work_years >= 3 and performance == "A" and isinstance(salary, (int, float)):
new_salary = salary * 1.2
ws.cell(row=row, column=4, value=new_salary)
ws.cell(row=row, column=6, value="入职满3年优秀员工涨薪20%")
wb.save("员工信息_优秀员工涨薪.xlsx")
print("✅ 多条件修改完成!")
3.3 替换特定内容
批量替换单元格中的特定文本:
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 把所有"技术部"替换为"研发中心"
old_text = "技术部"
new_text = "研发中心"
for row in range(1, ws.max_row + 1):
for col in range(1, ws.max_column + 1):
cell_value = ws.cell(row=row, column=col).value
if isinstance(cell_value, str) and old_text in cell_value:
# 替换内容
new_value = cell_value.replace(old_text, new_text)
ws.cell(row=row, column=col, value=new_value)
wb.save("员工信息_部门重命名.xlsx")
print("✅ 内容替换完成!")
四、使用pandas修改数据
对于结构化数据,用pandas修改更简单高效。
4.1 批量修改列数据
import pandas as pd
# 读取Excel
df = pd.read_excel("员工信息.xlsx")
# 修改整列数据:工资统一上涨10%
df["工资"] = df["工资"] * 1.1
# 修改特定条件的数据:绩效为A的再涨500元
df.loc[df["绩效"] == "A", "工资"] = df.loc[df["绩效"] == "A", "工资"] + 500
# 新增列
df["是否涨薪"] = df["工资"] > 15000
# 保存修改
df.to_excel("员工信息_pandas修改.xlsx", index=False)
print("✅ pandas批量修改完成!")
4.2 修改特定单元格
import pandas as pd
df = pd.read_excel("员工信息.xlsx")
# 修改单个单元格:修改索引为0(第一行数据)的员工工资为16000
df.loc[0, "工资"] = 16000
# 修改多个单元格:修改姓名为"李四"的绩效为"A"
df.loc[df["姓名"] == "李四", "绩效"] = "A"
# 条件修改:入职日期在2023年之前的员工,工龄加1
df["入职日期"] = pd.to_datetime(df["入职日期"])
df.loc[df["入职日期"].dt.year < 2023, "工龄"] = df.loc[df["入职日期"].dt.year < 2023, "工龄"] + 1
df.to_excel("员工信息_特定修改.xlsx", index=False)
print("✅ 特定单元格修改完成!")
4.3 替换数据
import pandas as pd
df = pd.read_excel("员工信息.xlsx")
# 替换部门名称
df["部门"] = df["部门"].replace("技术部", "研发中心")
# 批量替换:多个值同时替换
replace_map = {
"产品部": "产品中心",
"销售部": "营销中心",
"人事部": "人力资源部"
}
df["部门"] = df["部门"].replace(replace_map)
# 替换整个DataFrame中的特定值
df = df.replace("A+", "S")
df.to_excel("员工信息_批量替换.xlsx", index=False)
print("✅ 数据替换完成!")
五、修改单元格样式
除了修改内容,经常还需要修改单元格的样式,比如颜色、字体、对齐方式等。
5.1 设置字体样式
from openpyxl import load_workbook
from openpyxl.styles import Font, Color, colors
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 给工资大于15000的单元格设置红色加粗字体
bold_red_font = Font(bold=True, color=colors.RED)
for row in range(2, ws.max_row + 1):
salary = ws.cell(row=row, column=4).value
if isinstance(salary, (int, float)) and salary > 15000:
ws.cell(row=row, column=4).font = bold_red_font
wb.save("员工信息_样式修改.xlsx")
print("✅ 字体样式修改完成!")
5.2 设置单元格背景色
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 给绩效为A的单元格设置绿色背景
green_fill = PatternFill(start_color="98c379", end_color="98c379", fill_type="solid")
# 给绩效为C的单元格设置红色背景
red_fill = PatternFill(start_color="e06c75", end_color="e06c75", fill_type="solid")
for row in range(2, ws.max_row + 1):
performance = ws.cell(row=row, column=5).value
if performance == "A":
ws.cell(row=row, column=5).fill = green_fill
elif performance == "C":
ws.cell(row=row, column=5).fill = red_fill
wb.save("员工信息_背景色.xlsx")
print("✅ 背景色设置完成!")
5.3 设置对齐方式和边框
from openpyxl import load_workbook
from openpyxl.styles import Alignment, Border, Side
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 设置所有单元格居中对齐和细线边框
center_alignment = Alignment(horizontal="center", vertical="center")
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for row in range(1, ws.max_row + 1):
for col in range(1, ws.max_column + 1):
cell = ws.cell(row=row, column=col)
cell.alignment = center_alignment
cell.border = thin_border
wb.save("员工信息_格式优化.xlsx")
print("✅ 对齐和边框设置完成!")
5.4 设置数字格式
from openpyxl import load_workbook
from openpyxl.styles import numbers
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 设置工资列为货币格式
for row in range(2, ws.max_row + 1):
# 货币格式,带人民币符号
ws.cell(row=row, column=4).number_format = "¥#,##0"
# 入职日期设置为YYYY-MM-DD格式
ws.cell(row=row, column=3).number_format = "YYYY-MM-DD"
wb.save("员工信息_格式优化.xlsx")
print("✅ 数字格式设置完成!")
六、高级修改技巧
6.1 使用公式计算结果修改单元格
from openpyxl import load_workbook
wb = load_workbook("销售数据.xlsx")
ws = wb["销售数据"]
# 新增利润列,利润 = 销售额 * 0.3
ws["F1"] = "利润"
for row in range(2, ws.max_row + 1):
# 先写入公式计算
ws[f"F{row}"] = f"=E{row}*0.3"
# 计算后获取公式结果,保存为数值(避免公式丢失)
# 需要先保存再重新加载才能获取计算结果
wb.save("临时文件.xlsx")
# 重新加载,获取公式计算结果
wb2 = load_workbook("临时文件.xlsx", data_only=True)
ws2 = wb2["销售数据"]
# 创建新文件保存数值结果
wb3 = load_workbook("销售数据.xlsx")
ws3 = wb3["销售数据"]
ws3["F1"] = "利润"
for row in range(2, ws2.max_row + 1):
profit_value = ws2.cell(row=row, column=6).value
ws3.cell(row=row, column=6, value=profit_value)
wb3.save("销售数据_利润计算.xlsx")
import os
os.remove("临时文件.xlsx")
print("✅ 公式计算结果写入完成!")
6.2 批量修改多个Excel文件
import os
from openpyxl import load_workbook
# 批量修改某个文件夹下所有Excel文件的特定内容
folder_path = "月度报表/"
old_text = "2025年"
new_text = "2026年"
# 遍历文件夹下所有Excel文件
for filename in os.listdir(folder_path):
if filename.endswith((".xlsx", ".xls")) and not filename.startswith("~$"):
file_path = os.path.join(folder_path, filename)
print(f"正在处理:{filename}")
wb = load_workbook(file_path)
# 遍历所有工作表
for ws in wb.worksheets:
for row in range(1, ws.max_row + 1):
for col in range(1, ws.max_column + 1):
cell_value = ws.cell(row=row, column=col).value
if isinstance(cell_value, str) and old_text in cell_value:
new_value = cell_value.replace(old_text, new_text)
ws.cell(row=row, column=col, value=new_value)
# 保存修改,可以覆盖原文件或者另存为新文件
wb.save(os.path.join(folder_path, f"修改_{filename}"))
# wb.save(file_path) # 直接覆盖原文件
print("✅ 批量修改完成!")
6.3 查找并替换所有工作表中的内容
from openpyxl import load_workbook
wb = load_workbook("多工作表文件.xlsx")
old_text = "旧公司名"
new_text = "新公司名"
# 遍历所有工作表
for ws in wb.worksheets:
print(f"正在处理工作表:{ws.title}")
for row in range(1, ws.max_row + 1):
for col in range(1, ws.max_column + 1):
cell_value = ws.cell(row=row, column=col).value
if isinstance(cell_value, str) and old_text in cell_value:
new_value = cell_value.replace(old_text, new_text)
ws.cell(row=row, column=col, value=new_value)
wb.save("多工作表文件_替换后.xlsx")
print("✅ 所有工作表内容替换完成!")
七、常见问题与解决方案
7.1 修改后文件打不开
问题:保存后的Excel文件打开时提示损坏
解决方案:
7.2 修改后公式失效
问题:修改单元格内容后,相关公式没有重新计算
解决方案:
7.3 大文件修改速度慢
问题:修改几十MB的Excel文件时速度很慢
解决方案:
7.4 修改后格式丢失
问题:保存后原有的样式、图表、宏都不见了
解决方案:
7.5 权限错误无法保存
问题:保存时提示没有权限或者文件被占用
解决方案:
八、最佳实践
1. 修改前备份:任何修改前都先备份原文件,避免数据丢失
2. 小批量测试:修改大量文件前,先测试1-2个文件,确认修改逻辑正确再批量处理
3. 分步保存:修改过程中可以分步保存,避免程序崩溃丢失修改
4. 异常处理:添加try-except捕获异常,处理文件损坏、格式错误等问题
5. 日志记录:批量修改时记录修改的文件、单元格、修改前后的值,方便后续核查
6. 验证结果:修改完成后一定要打开文件检查,确认修改正确,尤其是公式和格式是否正常
通过以上方法,你可以轻松实现各种场景下的Excel单元格修改,无论是单个单元格调整还是批量条件修改,都能高效完成,大幅提升办公效率。