影刀RPA Excel操作的十大翻车现场
作者:林焱
什么情况用这个
影刀内置的Excel指令看起来简单——读写单元格、筛选排序、保存关闭。但实际用起来,翻车现场一个接一个:读取的数据格式不对、写入后文件打不开、多Sheet操作数据写到了错误的Sheet、save了但文件没变化、大文件操作流程直接卡死。

这些翻车场景的共同特点是:在调试时一切正常,上了生产环境就开始随机出问题。这篇文章从几百个实际案例中提炼出Excel操作最常见的十个翻车现场,每个都告诉你为什么会翻、怎么预防。
翻车现场
翻车一:保存了但没真的保存
现象:流程跑完了,打开Excel发现数据没更新。
原因:影刀的【保存Excel】指令只保存了内存中的数据,没有确保写入磁盘。如果程序崩溃或异常退出,数据就丢了。
解决:

# 安全保存Excel
import openpyxl
wb = openpyxl.load_workbook("D:/data/report.xlsx")
ws = wb.active
ws["A1"] = "新数据"
# 保存并验证
wb.save("D:/data/report.xlsx")
wb.close()
# 验证保存成功
wb_check = openpyxl.load_workbook("D:/data/report.xlsx")
assert wb_check.active["A1"].value == "新数据", "保存验证失败"
wb_check.close()
翻车二:数字被转成了文本/文本被转成了数字
拼多多店群自动化报活动上架!
现象:Excel里数字 00123 读出来变成了 123,或者 2025-03-15 被当成了日期。
解决:读取时指定数据类型:
# 读取时控制格式
df = pd.read_excel("data.xlsx", dtype={"订单号": str}) # 强制为字符串
# 写入时指定格式
writer = pd.ExcelWriter("output.xlsx", engine="openpyxl")
df.to_excel(writer, index=False)
ws = writer.sheets["Sheet1"]

# 设置列格式为文本
for cell in ws["A"]: # A列
cell.number_format = "@"
writer.close()
翻车三:操作大文件时流程卡死
现象:打开一个50MB的Excel文件,影刀卡了几分钟。
解决:
# 大文件用只读模式
wb = openpyxl.load_workbook("big_file.xlsx", read_only=True)
ws = wb.active
for row in ws.iter_rows(min_row=2, values_only=True):
process_row(row)
wb.close()
# 或者用pandas流式读写
for chunk in pd.read_excel("big_file.xlsx", chunksize=1000):
process_chunk(chunk)
翻车四:多Sheet操作把数据写错Sheet
现象:3个Sheet的Excel,往Sheet2写数据结果写到了Sheet1。

解决:操作前先激活目标Sheet:
wb = openpyxl.load_workbook("data.xlsx")
# 明确指定Sheet
ws = wb["目标Sheet名称"] # 或 wb.worksheets[1]
ws["A1"] = "新数据"
翻车五:文件被其他程序占用
现象:PermissionError: [Errno 13] Permission denied。
解决:

import time
def safe_open_excel(filepath, mode="r", retries=5):
"""安全打开——等待文件释放"""
for i in range(retries):
try:
if mode == "w":
return openpyxl.load_workbook(filepath)
else:
return openpyxl.load_workbook(filepath, read_only=True)
except PermissionError:
if i == retries - 1:
raise
print(f"文件被占用,重试{i+1}/{retries}...")
time.sleep(2)
翻车六:合并单元格导致的读取异常
现象:合并单元格中只有左上角的单元格有值,其他单元格都是None。
解决:
def safe_read_cell(ws, row, col):
"""安全读取——合并单元格也能读到值"""
cell = ws.cell(row=row, column=col)
if cell.value is not None:
return cell.value
# 检查是否在合并单元格范围内
for merged_range in ws.merged_cells.ranges:
if cell.coordinate in merged_range:
return ws.cell(
row=merged_range.min_row,
column=merged_range.min_col
).value
return None
翻车七:公式计算结果读不到

现象:Excel里看到的是 150(公式计算结果),影刀读出来是空或公式文本。
解决:用 data_only=True 读取计算结果值:
wb = openpyxl.load_workbook("formula.xlsx", data_only=True)
TEMU店群矩阵自动化运营核价报活动
翻车八:编码问题导致中文乱码

现象:CSV文件在Excel里中文正常,影刀读出来乱码。
解决:指定编码:
# CSV文件常见编码:utf-8, gbk, gb2312
df = pd.read_csv("data.csv", encoding="gbk")
# 不确定编码时逐个尝试
for enc in ["utf-8", "gbk", "gb2312", "gb18030"]:
try:
df = pd.read_csv("data.csv", encoding=enc)
break
except UnicodeDecodeError:
continue
翻车九:.xls 和 .xlsx 不兼容
现象:用openpyxl打开 .xls 文件报错。

解决:
# .xlsx → openpyxl
# .xls → xlrd
import xlrd # 读.xls
wb = xlrd.open_workbook("old_format.xls")
# 更好的做法:统一转换
def read_any_excel(filepath):
if filepath.endswith(".xlsx"):
return openpyxl.load_workbook(filepath)
elif filepath.endswith(".xls"):
return xlrd.open_workbook(filepath)
elif filepath.endswith(".csv"):
return pd.read_csv(filepath)
翻车十:删除行后索引不对
现象:ws.delete_rows(3) 后,原本第4行变成了第3行,后续操作全错位。
解决:从后往前删除:

# 要删除第2,5,8行
rows_to_delete = [2, 5, 8]
rows_to_delete.sort(reverse=True) # 从大到小排序
for row in rows_to_delete:
ws.delete_rows(row)
总结:Excel操作翻车的根源就三个——没有验证保存结果、没有指定数据格式、没有处理文件占用。每次操作Excel后加一行验证代码,能把翻车概率从30%降到5%以下。



被折叠的 条评论
为什么被折叠?



