影刀RPA Excel操作的十大翻车现场
影刀RPA Excel操作的十大翻车现场
作者:林焱
什么情况用这个
影刀内置的Excel指令看起来简单——读写单元格、筛选排序、保存关闭。但实际用起来,翻车现场一个接一个:读取的数据格式不对、写入后文件打不开、多Sheet操作数据写到了错误的Sheet、save了但文件没变化、大文件操作流程直接卡死。
这些翻车场景的共同特点是:在调试时一切正常,上了生产环境就开始随机出问题。这篇文章从几百个实际案例中提炼出Excel操作最常见的十个翻车现场,每个都告诉你为什么会翻、怎么预防。
翻车现场
翻车一:保存了但没真的保存
现象:流程跑完了,打开Excel发现数据没更新。
原因:影刀的【保存Excel】指令只保存了内存中的数据,没有确保写入磁盘。如果程序崩溃或异常退出,数据就丢了。
解决:
# 安全保存Excelimportopenpyxl 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")assertwb_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"]# 设置列格式为文本forcellinws["A"]:# A列cell.number_format="@"writer.close()翻车三:操作大文件时流程卡死
现象:打开一个50MB的Excel文件,影刀卡了几分钟。
解决:
# 大文件用只读模式wb=openpyxl.load_workbook("big_file.xlsx",read_only=True)ws=wb.activeforrowinws.iter_rows(min_row=2,values_only=True):process_row(row)wb.close()# 或者用pandas流式读写forchunkinpd.read_excel("big_file.xlsx",chunksize=1000):process_chunk(chunk)翻车四:多Sheet操作把数据写错Sheet
现象:3个Sheet的Excel,往Sheet2写数据结果写到了Sheet1。
解决:操作前先激活目标Sheet:
wb=openpyxl.load_workbook("data.xlsx")# 明确指定Sheetws=wb["目标Sheet名称"]# 或 wb.worksheets[1]ws["A1"]="新数据"翻车五:文件被其他程序占用
现象:PermissionError: [Errno 13] Permission denied。
解决:
importtimedefsafe_open_excel(filepath,mode="r",retries=5):"""安全打开——等待文件释放"""foriinrange(retries):try:ifmode=="w":returnopenpyxl.load_workbook(filepath)else:returnopenpyxl.load_workbook(filepath,read_only=True)exceptPermissionError:ifi==retries-1:raiseprint(f"文件被占用,重试{i+1}/{retries}...")time.sleep(2)翻车六:合并单元格导致的读取异常
现象:合并单元格中只有左上角的单元格有值,其他单元格都是None。
解决:
defsafe_read_cell(ws,row,col):"""安全读取——合并单元格也能读到值"""cell=ws.cell(row=row,column=col)ifcell.valueisnotNone:returncell.value# 检查是否在合并单元格范围内formerged_rangeinws.merged_cells.ranges:ifcell.coordinateinmerged_range:returnws.cell(row=merged_range.min_row,column=merged_range.min_col).valuereturnNone翻车七:公式计算结果读不到
现象:Excel里看到的是150(公式计算结果),影刀读出来是空或公式文本。
解决:用data_only=True读取计算结果值:
wb=openpyxl.load_workbook("formula.xlsx",data_only=True)TEMU店群矩阵自动化运营核价报活动
翻车八:编码问题导致中文乱码
现象:CSV文件在Excel里中文正常,影刀读出来乱码。
解决:指定编码:
# CSV文件常见编码:utf-8, gbk, gb2312df=pd.read_csv("data.csv",encoding="gbk")# 不确定编码时逐个尝试forencin["utf-8","gbk","gb2312","gb18030"]:try:df=pd.read_csv("data.csv",encoding=enc)breakexceptUnicodeDecodeError:continue翻车九:.xls和.xlsx不兼容
现象:用openpyxl打开.xls文件报错。
解决:
# .xlsx → openpyxl# .xls → xlrdimportxlrd# 读.xlswb=xlrd.open_workbook("old_format.xls")# 更好的做法:统一转换defread_any_excel(filepath):iffilepath.endswith(".xlsx"):returnopenpyxl.load_workbook(filepath)eliffilepath.endswith(".xls"):returnxlrd.open_workbook(filepath)eliffilepath.endswith(".csv"):returnpd.read_csv(filepath)翻车十:删除行后索引不对
现象:ws.delete_rows(3)后,原本第4行变成了第3行,后续操作全错位。
解决:从后往前删除:
# 要删除第2,5,8行rows_to_delete=[2,5,8]rows_to_delete.sort(reverse=True)# 从大到小排序forrowinrows_to_delete:ws.delete_rows(row)总结:Excel操作翻车的根源就三个——没有验证保存结果、没有指定数据格式、没有处理文件占用。每次操作Excel后加一行验证代码,能把翻车概率从30%降到5%以下。
