☰
影刀RPA新手教程:Excel自动化实战指南——批量读写公式处理与常见报错
2026/10/3 12:19:08 网站建设 项目流程

影刀RPA新手教程:Excel自动化实战指南——批量读写公式处理与常见报错

我第一次用影刀把采集到的100个商品数据写入Excel时,遇到了一个报错:Can not convert Array to String。排查了一下午才发现是因为我用【循环Excel内容】指令时,循环项是列表,不能直接写入单元格。后来我总结了Excel自动化的完整用法和5个常见报错的处理方法,现在写Excel基本不会报错。

Excel读取:4种读取方式直接给用法

1. 读取单元格

什么时候用:只需要读取一个单元格的数据,比如读取A1单元格的内容。

怎么用:

指令:读取Excel内容 Excel对象:excel_obj 读取方式:读取单元格 单元格:A1 读取格式:值 保存到:cell_value

读取格式的选择:

  • 值:读取单元格显示的值(比如公式=B1+C1的结果是10,就读到10)
  • 公式:读取单元格的公式文本(比如公式=B1+C1,就读到=B1+C1)
  • 单元格显示值:读取单元格格式化后显示的值(比如日期单元格显示为"2024-01-01",就读到"2024-01-01")

我踩过的坑:用openpyxl驱动读取Excel时,公式会被以字符串的形式读取到,而不是公式的计算结果。解决方法是在【启动Excel】指令中选择office或wps驱动方式。

2. 读取行

什么时候用:需要读取一整行的数据,比如读取第1行的标题行。

怎么用:

指令:读取Excel内容 Excel对象:excel_obj 读取方式:读取行 行号:1 读取格式:值 保存到:row_data

真实场景:读取Excel的第一行作为标题行,然后根据标题行的内容来写入数据。

关键点:row_data是一个列表,比如['标题1', '标题2', '标题3']。如果要把这个列表写入单元格,需要用【获取列表指定位置项】指令取出每一个元素,不能直接写入。

3. 读取区域

什么时候用:需要读取一个区域的数据,比如读取A1:C10这个区域的所有数据。

怎么用:

指令:读取Excel内容 Excel对象:excel_obj 读取方式:读取区域 读取范围:A1:C10 读取格式:值 保存到:range_data

真实场景:读取Excel中的一个表格区域,然后进行处理。

关键点:range_data是一个二维列表,比如[['标题1', '标题2'], ['数据1', '数据2']]。如果需要处理这个数据,需要用两层循环。

4. 读取全部数据

什么时候用:需要读取整个Sheet页的所有数据。

怎么用:

指令:读取Excel内容 Excel对象:excel_obj 读取方式:读取全部数据 读取格式:值 保存到:all_data

我第一次做的时候:用【读取全部数据】读取了一个大文件(10万行数据),结果内存不足报错。后来改成用【循环Excel内容】指令一行一行读取,才解决这个问题。

Excel写入:3种写入方式直接给用法

1. 写入单元格

什么时候用:只需要写入一个单元格,比如把"Hello"写入A1单元格。

怎么用:

指令:写入Excel内容 Excel对象:excel_obj 写入方式:写入单元格 单元格:A1 写入内容:"Hello"

真实场景:把采集到的商品标题写入Excel的A1单元格。

我踩过的坑:写入的内容是列表类型,比如['商品标题'],会报错Can not convert Array to String。解决方法是用【获取列表指定位置项】指令取出列表中的元素,再写入单元格。

2. 写入行

什么时候用:需要写入一整行的数据,比如把['标题1', '标题2', '标题3']写入第1行。

怎么用:

指令:写入Excel内容 Excel对象:excel_obj 写入方式:写入行 起始列:A 行号:1 写入内容:['标题1', '标题2', '标题3']

真实场景:把采集到的商品数据(标题、价格、销量)写入Excel的一行。

关键点:写入内容是列表类型,列表中的每一个元素会依次写入同一行的不同列。

3. 追加数据

什么时候用:需要在Excel的最后追加一行数据,不知道当前有多少行数据。

怎么用:

指令:可视化打开Excel工作表 文件路径:D:\test.xlsx Sheet名称:Sheet1 指令:在数据表格的最后追加一行内容 起始写入单元格的列名:A 内容:[1, 2, 3, 4, 5]

真实场景:把采集到的100个商品数据逐个追加到Excel中。

我的一般做法:优先用【追加数据】指令,因为不需要知道当前有多少行数据,直接追加到最后一行的后面。

批量处理:循环读取→处理→写入

场景:把一个Excel文件中的数据读取出来,进行处理(比如计算价格乘以2),然后写入另一个Excel文件。

完整流程:

1. 启动Excel文件(源文件) - 指令:启动Excel - 文件路径:D:\source.xlsx - 驱动方式:office - 保存到:source_excel 2. 启动Excel文件(目标文件) - 指令:启动Excel - 文件路径:D:\target.xlsx - 驱动方式:office - 保存到:target_excel 3. 循环读取源文件的数据 - 指令:循环Excel内容 - Excel对象:source_excel - 读取方式:读取行 - 循环变量:row_data 4. 处理数据(比如价格乘以2) - 指令:获取列表指定位置项 - 目标列表:row_data - 索引:1 # 假设价格在第2列(索引从0开始) - 保存到:price - 指令:乘法运算 - 被乘数:price - 乘数:2 - 保存到:new_price - 指令:更新列表指定位置项 - 目标列表:row_data - 索引:1 - 新值:new_price 5. 写入目标文件 - 指令:写入Excel内容 - Excel对象:target_excel - 写入方式:追加数据 - 写入内容:row_data 6. 结束循环 7. 保存并关闭Excel文件 - 指令:保存Excel - Excel对象:target_excel - 指令:关闭Excel - Excel对象:source_excel - 指令:关闭Excel - Excel对象:target_excel

我第一次做的时候:没有关闭Excel文件,导致文件一直被占用,下次打开时提示"文件被另一个程序占用"。后来在流程结束前加了【关闭Excel】指令,才解决这个问题。

公式处理:读取公式结果vs公式文本

场景1:读取公式的计算结果

怎么用:在【读取Excel内容】指令中,将"读取格式"设置为"值"。

指令:读取Excel内容 Excel对象:excel_obj 读取方式:读取单元格 单元格:A1 读取格式:值 保存到:result

场景2:读取公式的文本

方法1:用openpyxl驱动

指令:启动Excel 文件路径:D:\test.xlsx 驱动方式:openpyxl 保存到:excel_obj 指令:读取Excel内容 Excel对象:excel_obj 读取方式:读取单元格 单元格:A1 读取格式:公式 保存到:formula_text

方法2:用Python代码读取

from openpyxl import load_workbook def get_formula(file, row, col): wb = load_workbook(file, data_only=False) fm = wb.worksheets[0].cell(row, col).value return fm def main(args): a = get_formula(r'C:\临时\1.xlsx', 1, 1) print(a) # 输出:=B1+C1

我踩过的坑:用openpyxl驱动读取Excel时,公式会被以字符串的形式读取到,而不是公式的计算结果。如果需要读取计算结果,要用office或wps驱动方式。

格式处理:设置单元格格式

场景:把写入Excel的数据进行格式化,比如设置字体、颜色、边框、数字格式等。

方法1:用【设置格式】指令

指令:设置格式 Excel对象:excel_obj 格式化方式:设置字体 单元格:A1 字体名称:微软雅黑 字体大小:12 字体颜色:红色

我踩过的坑:用【设置格式】指令设置边框线时,会丢失掉表格原来的字体、加粗、单元格颜色等格式。解决方法是用Python代码来设置格式,可以保留原来的格式。

方法2:用Python代码设置格式

import xlwings as xw def set_format(file): app = xw.App(visible=False, add_book=False) wb = app.books.open(file) sht = wb.sheets[0] # 设置A1单元格的字体 sht.range('A1').api.Font.Name = '微软雅黑' sht.range('A1').api.Font.Size = 12 sht.range('A1').api.Font.Color = 255 # 红色 wb.save() wb.close() app.quit() def main(args): set_format(r'D:\test.xlsx')

5个常见报错与解决方法

报错1:Can not convert Array to String(Array to String)

原因:写入单元格的内容是列表类型,而单元格只能写入字符串或数字。

解决方法:

  1. 用【获取列表指定位置项】指令取出列表中的元素
  2. 或者用【文本处理】指令将列表转换为字符串

真实代码:

指令:获取列表指定位置项 目标列表:loop_excel # 循环Excel内容时的循环项 索引:0 保存到:cell_value 指令:填写输入框 目标:捕获的输入框元素 内容:cell_value # 现在是字符串,不是列表

我第一次遇到这个报错时:排查了一下午,一直以为是【填写输入框】指令用错了,后来用【打印日志】指令打印loop_excel的值,才发现是列表类型。

报错2:日期偏移(日期时间数据少了8个小时)

原因:使用office和wps驱动写入日期时间数据时,时间会早8个小时。因为影刀使用的Python的datetime.datetime类型,而office和wps需要的是COM类型的pywintypes.datetime。

解决方法:

方法1:将datetime.datetime类型转换为字符串类型后再写入

指令:日期时间转换为文本 日期时间:my_datetime 格式化字符串:%Y-%m-%d %H:%M:%S 保存到:date_str 指令:写入Excel内容 Excel对象:excel_obj 写入方式:写入单元格 单元格:A1 写入内容:date_str

方法2:使用openpyxl驱动写入日期数据

指令:启动Excel 文件路径:D:\test.xlsx 驱动方式:openpyxl 保存到:excel_obj 指令:写入Excel内容 Excel对象:excel_obj 写入方式:写入单元格 单元格:A1 写入内容:my_datetime

我踩过的坑:用方法1转换后,Excel中的日期变成了文本格式,不能进行日期计算。解决方法是在Excel中设置单元格格式为日期格式。

报错3:内存不足

原因:操作较大的Excel文件(比如10万行数据),进行读取、写入操作时,容易引发内存不足问题。

解决方法:

方法1:安装影刀64位版本

64位版本可以使用更多的内存,减少内存不足的问题。

方法2:使用pandas处理数据量较大的Excel

import pandas as pd def process_large_excel(file): # 用pandas读取Excel,性能更好 df = pd.read_excel(file) # 处理数据 df['新列'] = df['原列'] * 2 # 写入Excel df.to_excel(file, index=False) def main(args): process_large_excel(r'D:\大文件.xlsx')

方法3:一行一行读取和处理,不要一次性读取全部数据

指令:循环Excel内容 Excel对象:excel_obj 读取方式:读取行 ...处理当前行数据... 指令:写入Excel内容 Excel对象:target_excel 写入方式:追加数据 写入内容:processed_row 指令:结束循环

我的一般做法:如果Excel文件超过1万行,就用pandas来处理,不用影刀的【读取Excel内容】指令。

报错4:文件被占用

原因:Excel文件已经被其他程序打开(比如你手动打开了Excel文件,然后影刀也要操作这个文件),或者影刀没有正确关闭Excel文件。

解决方法:

方法1:确保Excel文件没有被其他程序打开

在操作Excel文件之前,先关闭所有打开的Excel程序。

方法2:在影刀流程结束前,关闭Excel文件

指令:关闭Excel Excel对象:excel_obj

方法3:检查文件是否被占用

指令:文件是否被占用 文件路径:D:\test.xlsx 保存到:is_locked if is_locked == True: 指令:打印日志 内容:"文件被占用,请关闭所有打开的Excel程序" 指令:终止流程

我第一次遇到这个报错时:流程跑到一半报错"文件被占用",但是我不知道哪个程序占用了文件。后来用【文件是否被占用】指令检查,才发现是我手动打开了这个Excel文件,没有关闭。

报错5:Sheet不存在

原因:指定的Sheet名称不存在于Excel文件中。

解决方法:

方法1:检查Sheet名称是否正确

确保Sheet名称和你Excel文件中的Sheet名称完全一致,包括大小写和空格。

方法2:获取所有Sheet名称,然后选择存在的Sheet

指令:获取所有Sheet页 Excel对象:excel_obj 保存到:all_sheets 指令:for每个循环 列表:all_sheets 循环变量:sheet if sheet.name == "Sheet1": 指令:激活Sheet页 Excel对象:excel_obj Sheet页:sheet

方法3:如果Sheet不存在,就创建它

指令:获取所有Sheet页 Excel对象:excel_obj 保存到:all_sheets 指令:设置变量 变量名:sheet_exists 变量值:False 指令:for每个循环 列表:all_sheets 循环变量:sheet if sheet.name == "新Sheet": 指令:设置变量 变量名:sheet_exists 变量值:True 指令:if条件判断 条件:sheet_exists == False 指令:新建Sheet页 Excel对象:excel_obj Sheet名称:新Sheet 指令:结束判断

我的一般做法:在【启动Excel】指令中,不指定Sheet名称,而是获取第一个Sheet页作为默认Sheet页。这样可以避免Sheet不存在的报错。

案例主线:把采集的100个商品数据批量写入Excel并自动格式化

场景:从网页上采集100个商品的数据(标题、价格、销量),然后写入Excel,并自动格式化(设置标题行加粗、设置价格列格式为货币、自动调整列宽)。

完整流程:

1. 启动Excel文件 - 指令:启动Excel - 文件路径:D:\商品数据.xlsx - 驱动方式:office - 保存到:excel_obj 2. 写入标题行 - 指令:写入Excel内容 - Excel对象:excel_obj - 写入方式:写入行 - 起始列:A - 行号:1 - 写入内容:['标题', '价格', '销量'] 3. 循环采集商品数据(假设已经采集到列表product_list中) - 指令:for每个循环 - 列表:product_list - 循环变量:product 4. 写入商品数据 - 指令:写入Excel内容 - Excel对象:excel_obj - 写入方式:追加数据 - 写入内容:product 5. 结束循环 6. 自动格式化 - 指令:设置格式 - Excel对象:excel_obj - 格式化方式:设置字体 - 单元格:A1:C1 # 标题行 - 字体加粗:是 - 指令:设置格式 - Excel对象:excel_obj - 格式化方式:设置数字格式 - 单元格:B2:B101 # 价格列 - 数字格式:货币 - 指令:设置格式 - Excel对象:excel_obj - 格式化方式:自动调整列宽 - 单元格:A1:C101 # 所有数据 7. 保存并关闭Excel文件 - 指令:保存Excel - Excel对象:excel_obj - 指令:关闭Excel - Excel对象:excel_obj

关键点:

  1. 先写入标题行,再追加商品数据
  2. 格式化要在所有数据写入完成后进行
  3. 流程结束前要保存并关闭Excel文件

12大模块覆盖检查

  1. 认识影刀/安装:【启动Excel】指令的使用
  2. 元素定位四合一:不需要元素定位(Excel操作是后台操作)
  3. 变量与数据类型:保存读取的单元格数据、保存列表数据
  4. 流程控制:for循环批量写入数据、if判断Sheet是否存在
  5. 网页自动化:从网页采集数据(本文的前提)
  6. 数据处理:读取Excel数据→处理→写入Excel(本文核心)
  7. 鼠标键盘图像自动化:不需要(Excel操作是后台操作)
  8. 进阶技能:用Python代码处理Excel(pandas、xlwings)
  9. 平台实战:可以把Excel文件上传到home.linyan.cloud(我搭建的一个数据展示页面)
  10. 系统联动:Excel操作是系统联动的一部分
  11. 工程化与规范:Excel操作的规范(先关闭文件再操作、定期检查文件是否被占用)
  12. 速查表/常见报错:
    • Can not convert Array to String(列表直接写入单元格报错)
    • 日期偏移(日期变成数字或少8个小时)
    • 内存不足(大文件处理)
    • 文件被占用(文件打不开)
    • Sheet不存在

速查表:Excel读取方式的选择

读取方式使用场景返回值类型优先级
读取单元格读取一个单元格字符串或数字最高(最简单)
读取行读取一整行列表高(读取一行数据)
读取区域读取一个区域二维列表中(读取表格数据)
读取全部数据读取整个Sheet页二维列表低(大文件会内存不足)

速查表:Excel写入方式的选择

写入方式使用场景写入内容类型优先级
写入单元格写入一个单元格字符串或数字最高(最简单)
写入行写入一整行列表高(写入一行数据)
追加数据在最后追加一行列表高(不知道当前有多少行)

我总结的Excel自动化黄金法则

  1. 优先用office或wps驱动:openpyxl驱动读取公式时会有问题
  2. 写入单元格前检查类型:确保不是列表类型,否则会报错Can not convert Array to String
  3. 日期时间数据要转换格式:直接写入会导致日期偏移8个小时
  4. 大文件处理要用pandas:不要用【读取全部数据】指令,会内存不足
  5. 操作前检查文件是否被占用:如果被占用,先关闭所有打开的Excel程序
  6. 流程结束前要保存并关闭Excel文件:否则文件会一直被占用
  7. Sheet不存在时要先创建:不要假设Sheet一定存在

常见报错与解决方法(补充)

报错6:单元格格式无法解析内容

原因:单元格的内容是一个电话号码,但是格式是日期,Excel就会显示为######等无法识别的内容。

解决方法:

  1. 在Excel中手动设置单元格格式为"文本"
  2. 或者在影刀中用【设置格式】指令设置单元格格式为"文本"

报错7:循环Excel内容时断点调试导致报错

原因:在循环内部打断点,然后继续运行,可能会导致循环项变量类型错误。

解决方法:

  1. 不要在循环内部打断点
  2. 如果需要调试,在循环外部打印日志

最后的建议

Excel自动化是影刀RPA中最常用的功能之一,几乎所有的业务流程都会用到。我建议:

  1. 先在小范围测试:不要一上来就处理10万行数据,先用100行数据测试通,再处理大文件
  2. 多用【打印日志】指令:记录当前处理到第几行、处理结果是什么,方便排查问题
  3. 大文件处理要用pandas:影刀原生的Excel指令性能有限,处理大文件要用pandas
  4. 定期检查文件是否被占用:如果流程报错"文件被占用",先检查是否有其他程序在占用这个文件

如果你在实践过程中遇到问题,可以访问home.linyan.cloud查看我整理的更多案例和解决方案。


内容标签:影刀RPA Excel自动化 批量读写 公式处理 常见报错 新手教程

作者:林焱

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询