You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Excel中将多单元格数据按ID重组为单行?

解决方案:按ID聚合多行数据为平铺列

Power Query 方案(完全适用,推荐)

Power Query完全能覆盖你的场景——10000个唯一ID、每个ID最多100行数据的规模,且支持动态适配任意数量的原始Value列。具体操作步骤如下:

  1. 导入数据到Power Query
    选中目标数据区域,点击「数据」选项卡 →「自表格/区域」(确保勾选「我的表格具有标题」)。

  2. 按ID分组打包行数据
    在Power Query编辑器中选中ID列,点击「转换」选项卡 →「分组依据」:

    • 分组依据:ID
    • 新列名:GroupedRows
    • 操作选择:所有行
      确认后,每个ID对应的所有原始行将被打包为一个列表。
  3. 生成扁平值列表
    添加自定义列(「添加列」→「自定义列」),输入公式:

    List.Combine(List.Transform([GroupedRows], each Record.ToList(_) skip 1))
    

    该公式会将每组内的每一行去掉ID字段,再把所有Value值合并成连续的扁平列表。

  4. 展开列表并重命名列

    • 删除GroupedRows列;
    • 点击自定义列右侧的展开箭头,选择「将值扩展到新列」;
    • 选中所有新列,右键→「重命名」,用1、2、3...序列批量命名(也可通过「转换」→「格式」→「自定义」,输入Text.From([ColumnIndex])自动生成序号)。
  5. 加载回Excel
    点击「关闭并上载」,即可得到目标格式的数据。

其他可选方案

VBA 宏方案

适合熟悉Excel宏的用户,本地处理速度快,无需额外工具:

Sub FlattenIDRows()
    Dim ws As Worksheet, lastRow As Long, lastCol As Long
    Dim dataDict As Object, idKey As Variant, rowVals As Variant
    Dim maxTotalCols As Integer, outputRow As Integer, colIdx As Integer
    
    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    Set dataDict = CreateObject("Scripting.Dictionary")
    
    ' 读取数据到字典:键为ID,值为所有Value的扁平数组
    For i = 2 To lastRow
        idKey = ws.Cells(i, 1).Value
        rowVals = ws.Range(ws.Cells(i, 2), ws.Cells(i, lastCol)).Value
        rowVals = Application.Transpose(Application.Transpose(rowVals)) ' 转成一维数组
        
        If dataDict.Exists(idKey) Then
            dataDict(idKey) = dataDict(idKey) & rowVals
        Else
            dataDict(idKey) = rowVals
        End If
    Next i
    
    ' 计算最大列数并设置表头
    maxTotalCols = 0
    For Each idKey In dataDict
        If UBound(dataDict(idKey)) > maxTotalCols Then
            maxTotalCols = UBound(dataDict(idKey))
        End If
    Next idKey
    
    ws.Cells.ClearContents
    ws.Cells(1, 1).Value = "ID"
    For colIdx = 1 To maxTotalCols
        ws.Cells(1, colIdx + 1).Value = colIdx
    Next colIdx
    
    ' 写入结果数据
    outputRow = 2
    For Each idKey In dataDict
        ws.Cells(outputRow, 1).Value = idKey
        For colIdx = 1 To UBound(dataDict(idKey))
            ws.Cells(outputRow, colIdx + 1).Value = dataDict(idKey)(colIdx)
        Next colIdx
        outputRow = outputRow + 1
    Next idKey
End Sub

使用方法:按Alt+F11打开VBA编辑器,插入模块后粘贴代码,回到Excel执行宏即可。

Python Pandas 方案

适合大数据量场景或有Python基础的用户,代码简洁高效:

import pandas as pd

# 读取原始数据(替换为你的文件路径)
df = pd.read_excel("your_input_file.xlsx")

# 按ID分组,将每组的Value列扁平化并展开成新列
flattened_df = df.groupby("ID").apply(
    lambda group: pd.Series(group.drop("ID", axis=1).values.flatten())
).unstack()

# 重命名列为1、2、3...
flattened_df.columns = [str(i+1) for i in range(flattened_df.shape[1])]

# 重置索引,将ID放回第一列
result_df = flattened_df.reset_index()

# 保存结果(替换为你的输出路径)
result_df.to_excel("your_output_file.xlsx", index=False)

内容的提问来源于stack exchange,提问作者Antti Ellonen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:13:19