Excel处理,如何把Excel表格中符合条件的行合并


如图,希望把表一中的数据整理合并为表二的内容,条件是当“摘要”和“对方账户名称”一致时候,将收款金额合并为一行数据同时计数原始数据有几行合并,这个需求可以怎么处理呢?

_Excel处理,如何把Excel表格中符合条件的行合并

最新回复 (7)
  • 诺亚方舟 6月前
    2
    利用字典Key存储 摘要 & "|" & 对方账户名称,作为唯一索引。
    遍历表一,每次存储都判断Key是否存在,不存在就新建,存在就累加,字典Value定义为数组,可存放多组数据。
    但是交易编号不应该出现在表二中,因为计数为多个时,交易编号展示哪个呢,
    交易日期参照交易编号,如果出现在表二中,需要考虑日期不一样,但摘要和对方账户名称均一致的情况下,显示哪个日期。
  • 3

    老师,可否帮忙简单写个示例?日期都是同一天的,交易编号可以不用取

    上传的附件:
  • asdfasdf_652328 6月前
    4



    是要像这样的效果吗?I列是合并计算之后的

  • 5
    asdfasdf_652328 是要像这样的效果吗?I列是合并计算之后的
    嗯嗯 也考虑这样的结果,可以给一下代码吗?或者分享一下思路?
  • asdfasdf_652328 6月前
    6
    +86 159******32_841551 嗯嗯 也考虑这样的结果,可以给一下代码吗?或者分享一下思路?



    我只能跟你说思路·以便你能自己掌握,图上是显示了公式的。

    手动的过程是这样的: C是一个把AB联立的列,把C列和E列合并计算后,得到F和G列,然后H列匹配得到以按C列来排好的G列金额。 C列内容相同的单元格合并就会有D列这个格式,再把D列的格式 用格式刷刷到I列·,就是说H列刷一下格式后就是I列 ·(不直接 内容相同的单元格合并H列是因为H列是有可能算出来金额相同但是又是另一个摘要的。)

    用机器人去实现以上手动过程有三个难点·第一点合并计算 第二点 格式刷,第三点合并相同内容的单元格。
    最简单的手法:这三点都可以通过键盘鼠标模拟来实现,比如合并计算可以用 ALT  D N然后再用拖动去选中列就行了。你可能会有疑问·如果我的列到处跑呢?不一定在那个位置,你可以在机器人前面留流程中加上列宽设置,然后表格每个单元格的位置都是固定的来实现。
    当然键盘鼠标模拟有时候是不稳定的,你可以把以下文本复制在复制到\6.0.1.220629\extend\python中 保存为.py文件在机器人调用这两个函数(详细做法请查阅uibot官方文档),合并计算的函数输入和输出都是数组,你把读取的数组喂给这个函数然后再用一个变量去接输出的结果即可,格式刷的函数使用前需要激活当前的工作表哦。如果你需要其他功能,可以把以下函数喂给chatgpt让他在win32的库内(其他库uibot需要装才能用,太复杂不推荐)选择函数来修改,把原有的功能去掉加上你想要的功能即可。


    ///合并计算///

    def merge_cells_and_return_data(data):

        # 提取表头

        headers = data[0]

        # 定义字典用于保存合并后的数据

        count_dict = {}

        # 过滤无效数据并合并计算

        for row in data[1:]:

            name = row[0]

            count_str = row[1]

            try:

                count = float(count_str)

                if name in count_dict:

                    count_dict[name] += count

                else:

                    count_dict[name] = count

            except ValueError:

                pass

        # 构造返回数据数组

        output_data = [headers]

        for name, count in count_dict.items():

            output_data.append([name, count])

        return output_data


    """格式刷"""

    def change_cell_format_brush(file_name, sheet_name, source_cell, target_cell):

        

        # 获取当前已经打开的 Excel 应用程序实例

        try:

            excel = win32com.client.GetActiveObject("Excel.Application")

        except Exception:

            print("没有找到已经打开的 Excel 应用程序")

            return

        

        # 获取工作簿和工作表对象

        workbook = excel.Workbooks(file_name)

        try:

            worksheet = workbook.Worksheets(sheet_name)

        except Exception:

            print("无法找到工作表: ", sheet_name)

            return

        

        # 判断单元格地址是否为范围地址

        if ":" in source_cell:

            source_range = source_cell

        else:

            source_range = "{}:{}".format(source_cell, source_cell)

        # 得到源单元格范围对象

        source_range_obj = worksheet.Range(source_range)

        

        # 判断目标单元格地址是否为范围地址

        if ":" in target_cell:

            target_range = target_cell

        else:

            target_range = "{}:{}".format(target_cell, target_cell)

        # 得到目标单元格范围对象

        target_range_obj = worksheet.Range(target_range)

        

        # 应用格式刷

        source_range_obj.Copy()

        target_range_obj.PasteSpecial(-4122)  # 格式刷


  • asdfasdf_652328 6月前
    7
    用机器人在表格里面输入公式,涉及到转义字符那些·也是有点难· 但是那个多尝试是可以自己弄好的,把一整列的公式输进去,会涉及到变量在要输的公式里面。如果太难得话,又着急用,还是可以用键盘鼠标去模拟的,因为前面说到了,可以通过设置每一列的列宽去固定单元格的位置,所以,当你搞定第一行的公式之后,用鼠标去点那个右下角的点就可以得到一整列的公式,然后再用CTRL+向上回去到表格上方就行
  • 8
    asdfasdf_652328 用机器人在表格里面输入公式,涉及到转义字符那些·也是有点难· 但是那个多尝试是可以自己弄好的,把一整列的公式输进去,会涉及到变量在要输的公式里面。如果太难得话,又着急用,还是可以用键盘鼠标去模拟的,因 ...
    学习了,非常感谢!!
返回
发新帖