【解决方案】用python代替sumifs,Excel再也不卡了!———by.御花园自动化小组
评论
收藏

【解决方案】用python代替sumifs,Excel再也不卡了!———by.御花园自动化小组

经验分享
小曼
2023-12-12 11:05·浏览量:793
小曼
发布于 2023-12-12 10:10更新于 2023-12-12 11:05793浏览

问题:

客户有个表,需要汇总计算的数据有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秒的时间,后续操作表格,因为没有了公式,所以不会重新计算,不会出现卡顿的情形了。

收藏6
全部评论1
最新
发布评论
评论