跳到主要内容

🔖 填表


本示例展示读取表格数据批量填表。

✅️ 任务分析

有如下表格文件'data.xlsx'

姓名性别年龄班级身高体重学号兴趣状态
刘一15一班175.570.434篮球已填报
陈二16二班168.166.721足球已填报
张三14三班167.474.467乒乓球已填报
李四16一班160.168.427羽毛球已填报
王五14三班170.180.046羽毛球出错
赵六15四班159.059.317篮球已填报
孙七15四班155.355.347足球
周八14三班180.185.324象棋
吴九16四班154.653.125游泳
郑十16一班177.569.219排球

需要把数据批量填报到网页:填表示例

可以用Recorder对象的rows()方法,批量读取数据,用DrissionPage操作网页填写数据。

表格中,有些行状态列是'已填报',表示此次运行时需忽略。

并且每处理一行,就要把该行的这列标记为'已填报'


✅️ 完整代码

from DrissionPage import Chromium
from DrissionRecord import Recorder

t = Chromium().latest_tab
r = Recorder('data.xlsx', cache_size=1) # 创建对象,每条数据保存一次
r.set.show_msg(False) # 不打印提示信息

t.get('https://drissionpage.cn/Demos/table.html')
for row in r.rows(sign_col='状态', signs='已填报', deny_sign=True): # 筛选行并遍历
print('填报:', row['姓名'])
t('姓名')('t:input').input(row['姓名'])
t('性别')('t:select').select(row['性别'])
t('年龄')('t:input').input(row['年龄'])
t('班级')('t:input').input(row['班级'])
t('身高')('t:input').input(row['身高'])
t('体重')('t:input').input(row['体重'])
t('学号')('t:input').input(row['学号'])
t('兴趣')('t:input').input(row['兴趣'])
t.wait(2) # 为便于观看效果,等待2秒
t('提交').click()
r.add_data({'状态': '已填报'}, row.row) # 更新该行状态值

✅️ 代码解读

📌 rows()参数设置

本例中,我们需要筛选出状态不是'已填报'的行,所以sign_col参数传入'状态',表示这一列是筛选条件。

signs参数传入'已填报',且deny_sign参数设为True,表示筛选条件是 “不等于'已填报'”。


📌 读取行数据并填报

row变量是每行数据,用['姓名']可从中取出 “姓名” 列的值。

读取需要填报的所有值,用 DrissionPage 的input()select()方法填表。


📌 回写状态

处理完毕后,需要把'已填报'填写到相应行的状态列。

row.row获取到当前的行号。

r.add_data({'状态': '已填报'}, row.row)表示向表头为'状态'的列写入'已填报',行号为row.row的值。

这一句还有其他写法,作用相同:

r.add_data('已填报', (row.row, 9))  # 用tuple指定坐标
r.add_data('已填报', f'I{row.row}') # 用A3格式指定坐标
r.add_data('已填报', row.coord('状态')) # 用coord()方法获取“状态”列坐标

r.set.data_col('I') # 先设置数据输入列
r.add_data('已填报', row.row) # 设置data_col后只要指定行号即可

📌 保存结果

因为cache_size设置为1,每写入一条数据会自动保存到文件,所以最后不用写r.record()