下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/caitou--xlsx-split-by-column.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @caitou/xlsx-split-by-column。- 按指定列拆分 Excel 文件,每个唯一值生成一个独立 xlsx(如按合作伙伴/部门/客户拆表)。支持 20 万行以上大文件(XML 直解,45 秒完成),零第三方依赖。当用户说"
- 按XX列拆分"
- 、"
- 每个XX单独一个文件"
- 、"
- 拆分单独合作伙伴文件"
- …(完整说明见下方「阅读全文」)
阅读全文 (展开查看完整说明)
概述
将一个大 Excel 文件按指定列的值拆分为多个独立文件,每个唯一值生成一个 {值}{原文件名}.xlsx,完整保留原表头。
核心优势:
- 🚀 大文件不卡死:直接解析 xlsx 内部 XML(ZIP+正则流式处理),23 万行仅 45 秒(openpyxl 处理 21 万行会卡死 10 分钟以上)
- 🔧 零依赖:只用 Python 标准库(zipfile/re),无需安装任何第三方包
- 🎯 按列名自动定位:不管目标列在 F 列还是 AF 列,传列名就能找到
- 📁 保留原表头:每个拆分文件都带完整表头,拿到就能用
典型场景
- 渠道/代理商分润报表 → 按合作伙伴拆分后分发
- 销售业绩表 → 按业务员/部门拆分
- 客户对账单 → 按客户名拆分
- 任意"一列多种值、每种值要单独一个文件"的需求
触发短语
匹配任一即触发:
- "按XX拆分" / "按XX列拆分"
- "每XX一个文件" / "每人一个表"
- "把XX单独筛选出来"
- "拆分单独合作伙伴文件"(快捷命令,默认按"合作伙伴"列)
- "xlsx split"
使用流程
第 1 步:探查文件结构(新文件必做)
拆分列位置多变,不能凭经验猜。用 zipfile+正则直接读前 3 行确认总行数、表头行数、目标列位置:
python -c "
import zipfile, re
z = zipfile.ZipFile(r'<源文件路径>')
ss=[]
try:
x=z.read('xl/sharedStrings.xml')
for m in re.finditer(rb'<sib[^>]*>(.*?)</si>',x,re.DOTALL):
t=b''.join(re.findall(rb'<t[^>]*>(.*?)</t>',m.group(1),re.DOTALL)).decode('utf-8','replace')
ss.append(t)
except KeyError: pass
print('sheets:', [n for n in z.namelist() if n.startswith('xl/worksheets/s')])
sheet=z.read('xl/worksheets/sheet1.xml')
rows=re.findall(rb'<rowb[^>]*>.*?</row>',sheet,re.DOTALL)
print('总行数:',len(rows))
for rn,r in enumerate(rows[:3],1):
cells={}
for c in re.finditer(rb'<c r="([A-Z]+)d+"[^>]*>(.*?)</c>',r,re.DOTALL):
ref,body=c.group(1).decode(),c.group(2)
if b't="s"' in c.group(0)[:250]:
m=re.search(rb'<v>(d+)</v>',body); v=ss[int(m.group(1))] if m else ''
else:
m=re.search(rb'<v>(.*?)</v>',body); v=m.group(1).decode('utf-8','replace') if m else ''
if v: cells[ref]=v
print(f'--- 行{rn} ({len(cells)}个非空):', dict(list(cells.items())[:30]))
"注意:
- 确认表头是单行还是多行(多行表头的报表,fast_split.py 找不到列名时需自行适配,保留全部表头行)
- 从表头行找到目标列的列名(如"合作伙伴")
第 2 步:执行拆分
rm -rf "<输出目录>" && python "{SKILL_DIR}/scripts/fast_split.py" "<源文件>" "<拆分列名>" --output-dir "<输出目录>"关键点:
- 第 2 个参数传列名(如"合作伙伴"),不是列字母!传"AF"会报"Column not found"
- 先清掉旧输出目录再拆,避免重拆时新旧文件混杂
- 小文件(<1 万行)也可用
split_by_column.py(基于 openpyxl,需安装),但统一推荐 fast_split.py - 多行表头的文件需自行写适配脚本(保留全部表头行,数据按目标列分组)
第 3 步:汇报
表格形式汇报(值+行数),末尾校验合计行数 = 源数据行数,并给出输出目录路径。
输出规范
- 输出目录:当前工作区
outputs/{原文件名}_拆分结果/ - 命名:
{列值}{原文件名}.xlsx - 文件名自动处理非法字符(
/ : * ? " < > |)
注意事项
- 只依赖 Python 3 标准库,无需 pip 安装任何包
- 大文件(>20MB)探查和拆分都用 XML 直解方式,避免内存问题
- 源文件在移动硬盘/桌面等外部目录也能读,输出统一放工作区
- 拆分列位置经常变(同一文件类型不同月份都可能不同),每次都先探查、按列名定位