客户有个表,需要汇总计算的数据有14万8千多行,每次打开都特别慢,需要50秒,而且在表格里面新增其他公式的话,又要重新计算一遍,很崩溃。
究其原因,里面有太多的sumifs公式。用python可以帮助计算,不过网上的代码五花八门、客户自己写还要学习字典、列表、pandas,门槛太高。是否可以写一个通用的流程,客户只需要将参数填进去就OK了。当然可以。
1、在影刀中新建python模块,代码如下:
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import pandas as pd
def main(args):
pass
def sumifs_excel(dataSourceList, targetAreaList,criteria_col_names,sum_col_names):
df1 = pd.DataFrame(dataSourceList[1:], columns=dataSourceList[0])
df2 = pd.DataFrame(targetAreaList[1:], columns=targetAreaList[0])
# 使用 groupby 方法对店铺名称和是否作废列进行分组
groups = df1.groupby(criteria_col_names)
# 对每个组应用sum方法,并将结果保存在一个字典中
result_dict = {group_name: groups.get_group(group_name)[sum_col_names].sum() for group_name in groups.groups.keys()}
# 将字典转换为DataFrame
result_df1 = pd.DataFrame(result_dict).T
result_df1 = result_df1.reset_index()
result_df1.columns = criteria_col_names+sum_col_names
# print(result_df1)
# 使用merge()函数根据多个列进行合并
merged_df = pd.merge(df2, result_df1, on=criteria_col_names, how='left')
# print(merged_df)
return merged_df.values.tolist()
2、在影刀中进行调用。填写说明:
dataSourceList:列表类型,读取到的数据源区域列表,包含标题。
targetAreaList:列表类型,读取到的目标条件区域列表,包含标题。
criteria_col_names:列表类型,条件列名称列表。
sum_col_names:列表类型,求和列名称列表。
例如,要根据表1的内容,对表2中符合条件的“购买单价”和“购买数量”进行求和。
表1

表2


打开、计算、写入,总共需要15秒的时间,后续操作表格,因为没有了公式,所以不会重新计算,不会出现卡顿的情形了。