Python 自动化 Excel 修改已有单元格内容


Python 自动化 Excel 修改已有单元格内容

Python 自动化 Excel 修改已有单元格内容详细教程

在实际工作中,我们经常需要修改已有的Excel文件,比如更新数据、修正错误、批量替换内容等。Python提供了非常方便的方法来修改Excel单元格内容,本文将详细介绍各种修改场景的实现方法,包含完整代码示例和最佳实践。


一、环境准备

1.1 安装依赖库

bash
pip install openpyxl pandas

1.2 注意事项

⚠️ 重要提醒

1. 修改文件前一定要备份原文件,避免修改出错导致数据丢失

2. 不要修改正在打开的Excel文件,会导致保存失败

3. 大文件修改建议先复制一份,在副本上修改,确认无误后再替换原文件

4. 带密码保护的Excel文件需要先解密才能修改


二、基础修改操作

2.1 使用openpyxl修改单个单元格

openpyxl是修改Excel最常用的库,支持精细控制:

python
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 修改多个单元格

批量修改指定单元格:

python
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 修改整行/整列

python
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%:

python
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 多条件修改

多个条件同时满足才修改:

python
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 替换特定内容

批量替换单元格中的特定文本:

python
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 批量修改列数据

python
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 修改特定单元格

python
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 替换数据

python
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 设置字体样式

python
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 设置单元格背景色

python
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 设置对齐方式和边框

python
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 设置数字格式

python
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 使用公式计算结果修改单元格

python
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文件

python
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 查找并替换所有工作表中的内容

python
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文件打开时提示损坏

解决方案

修改前一定要备份原文件
保存时确保文件后缀是.xlsx,不要和.xls混用
检查是否修改了公式、图表等复杂内容导致格式错误
尝试用openpyxl的只读模式打开看看是否能读取内容,再新建文件复制过去

7.2 修改后公式失效

问题:修改单元格内容后,相关公式没有重新计算

解决方案

设置自动计算:`wb.calculation.calcMode = "auto"`
打开Excel后按F9手动刷新计算
保存前先计算公式结果,直接保存数值(参考6.1节方法)

7.3 大文件修改速度慢

问题:修改几十MB的Excel文件时速度很慢

解决方案

如果只需要修改数据,用pandas读取修改,速度快很多
不需要修改格式的话,用pandas处理后再保存
只修改部分内容的话,可以使用openpyxl的只读+只写模式,避免加载整个文件到内存

7.4 修改后格式丢失

问题:保存后原有的样式、图表、宏都不见了

解决方案

openpyxl不支持宏文件(.xlsm),修改宏文件会丢失宏
复杂图表修改后可能出现格式问题,建议先备份
不需要修改格式的话,修改时尽量不要动原有样式

7.5 权限错误无法保存

问题:保存时提示没有权限或者文件被占用

解决方案

先关闭正在打开的Excel文件
检查文件是否设置了只读属性
保存到其他路径,或者改个文件名
管理员权限运行程序

八、最佳实践

1. 修改前备份:任何修改前都先备份原文件,避免数据丢失

2. 小批量测试:修改大量文件前,先测试1-2个文件,确认修改逻辑正确再批量处理

3. 分步保存:修改过程中可以分步保存,避免程序崩溃丢失修改

4. 异常处理:添加try-except捕获异常,处理文件损坏、格式错误等问题

5. 日志记录:批量修改时记录修改的文件、单元格、修改前后的值,方便后续核查

6. 验证结果:修改完成后一定要打开文件检查,确认修改正确,尤其是公式和格式是否正常

通过以上方法,你可以轻松实现各种场景下的Excel单元格修改,无论是单个单元格调整还是批量条件修改,都能高效完成,大幅提升办公效率。

© 版权声明

相关文章

暂无评论

none
暂无评论...