摘要

一老大哥处理 excel 搞不过来了,领导又着急要。所以就来找我帮忙了。幸不辱使命,我很快便搞了出来,简单记录一下。

正文

一、实战

需求如下:

有个 excel,1000 行左右,现在需要让他变成 5000行,每 1 行数据变成相同的 5 行

我现在是新入职公司,有个带我的大哥。这大哥的领导着急要这个 excel,他让 ai 来处理,使用的也是时下最热门的 claude opus 4.8 模型。ai 分为三步走

  1. 读取 excel
  2. 编写 python 脚本,处理数据
  3. 编写验证脚本,验证数据

这一套流程下来,几分钟根本搞不完。所以大哥就来问我了,既然大哥有命,我这当小弟的也应该尽份力。

excel 本身很强大,直接使用内置的公式功能。分为如下几步

  1. 将原 Sheet1 复制出来命名为 Tmp
  2. 在 Tmp 中,找 A1 作为起始单元格,编写公式=INDEX(sheet1!A:A, INT((ROW()-1)/4)+1),然后向右拉取想要复制的列数、向下拉取想要复制的行数
  3. 新建另一个名为 Result 的 sheet,选中 Tmp 中所有的数据,以的格式粘贴

最后成果如图

秒秒钟解决,大哥欠了我一个人情。

后面对我的态度也转变了不少。以前我刚来时,问问题,他都有点爱答不理,现在次次秒回!人情社会啊

二、公式原理

text
1
=INDEX(Sheet1!A:A, INT((ROW()-1)/4)+1)

用法:输入后向右拖到需要的列数,再向下拖到足够行数,即可将 Sheet1 的数据以每4行为单位展开。

2.1 核心函数

INDEX(array, row_num):从指定数组中返回第 row_num 行的值。

ROW():返回当前单元格所在的行号,第 1 行返回 1,第 5 行返回 5。

INT(number):向下取整,去掉小数部分,INT(1.9) = 1

跨表引用语法

  • =Sheet1!A1:C10:选中 Sheet1 的 A1 到 C10 区域,从左上到右下
  • =Sheet1!A:C:选中 Sheet1 的 A 到 C 的区域,从左上到右下,即 A、B、C 三整列
  • =Sheet1!A:A:选中 Sheet1 的整个 A 列。

2.1 原理推导

关键在于构造这个映射:INT((ROW()-1)/4)+1

当前行 ROW()(ROW()-1)/4INT(...)引用的原始行
10/4 = 0.0001
21/4 = 0.2501
32/4 = 0.5001
43/4 = 0.7501
54/4 = 1.0012
65/4 = 1.2512
76/4 = 1.5012
87/4 = 1.7512
98/4 = 2.0023

直观理解

普通 ROW() 每行 +1,这个公式每 4 行才 +1,就像一个"慢速计数器",实现数据的重复展开。

改变重复次数,只需替换数字 4

text
1
2
=INDEX(Sheet1!A:A, INT((ROW()-1)/3)+1)   ' 每3行重复一次
=INDEX(Sheet1!A:A, INT((ROW()-1)/6)+1)   ' 每6行重复一次