用来收拾 Excel / WPS 表格里那些"手工干太累、又不好意思麻烦别人"的活儿。
免安装,双击就用,不需要装 Office 或 WPS 也能跑(它自己会读写 xlsx)。
一、文件清单:双击哪个?
打开目录 D:\你的工作目录\05_工具脚本\TableTidy\dist\
| 文件 | 干什么用的 |
|---|---|
| 表格整理工具.exe | ← 双击这个。成品,免安装,可以拷到 U 盘、别的电脑上用(64 位 Windows) |
table_tidy.py | 源码(界面 + 算法都在里面) |
test_table_tidy.py | 自动化校验脚本,231 项检查(改代码后跑一下,确认没改坏) |
verify_gui.py | 界面布局检查,确认控件没被挤出窗口 |
make_icon.py | 图标生成脚本 |
它不会动你的原文件。 所有结果都是"另存一份",原表一个字节都不改。
二、快速上手:你说的那个场景
"C 列的数据在 A 列有没有,有的话把对应的 B 列值放到 D 列"
- 双击 exe
- 点「主表」旁边的「浏览…」,选中你的表格
- 左上角「辅表」留空不用管(留空 = 就在这张表内部查找)
- 「匹配查找」页里四个框,工具已经帮你填好了默认值:
| 框 | 默认 | 意思 |
|---|---|---|
| ① 拿哪一列去查 | C | 用 C 列的值作为查找依据 |
| ② 到哪里查 | A | 到 A 列里找有没有 |
| ③ 取回 | B | 找到了就把同一行的 B 列值取出来 |
| ④ 结果写到 | D | 写到 D 列(D 列不存在会自动新建) |
- 点「开始匹配」
- 会自动跳到「结果预览」页,先看看对不对
- 对了就点左下角「导出结果…」,默认文件名是
原文件名_整理结果.xlsx
结果预览页上方会显示一句话,比如:
【匹配查找】C 列 → 查本表的 A 列 → 取回 B 列 → 写入 D 列;忽略空格、忽略大小写、数值等价、全角半角。共处理 128 行:匹配到 120 行,未匹配 8 行。
那 8 行没匹配上的,就是你真正需要人工看一眼的。 这就是这工具省时间的地方。
三、六个功能分别管什么
1. 匹配查找(最常用)
上面那个场景。除此之外还能干这些:
- 跨文件匹配:选上「辅表」,就是拿着主表 C 列的值,去另一个文件的 A 列里找,取回那个文件的某一列填进来 —— 相当于 VLOOKUP,但不用写公式。
- 只想知道"有没有":把 ③ 取回 也填成查找列自己,结果列填什么无所谓,主要看勾选的「另外加一列 √ / × 标记」 —— 会多出一列,找到的标 √,没找到的标 ×。这就是"查重/查缺"。
- 写到中间某一列:④ 填
B就写到 B 列,填F就写到 F 列,不限于最后一列。 - 写入列填一个新名字(比如
对应部门),工具会自动新增一列,并且把列名设成你写的名字。
⚠️ 一个安全提醒:如果 ④ 填的那一列原本就有数据,工具会弹窗告诉你"这一列原本有 N 个非空数据,继续会覆盖",你可以选择取消。默认填 D 的时候,如果你的表本来就 4 列以上、D 列有内容,就会遇到这个提示 —— 那时建议改填一个新列(写个列名,如 匹配结果)。
2. 差异比对
比两列(或者主表一列 vs 辅表一列),列出:
- 只有左边有的
- 只有右边有的
- 两边都有的
结果排成三列,一眼看清。适合核对"这两个名单对不对得上""发货清单和订单清单差哪些"。
3. 去重
按一列或几列判断重复,保留第一条(或最后一条)。
- 判断依据列可以填多个,用逗号隔开,例如
A,C。 - "整行完全一样才算重复"的话,就把用到的列都填进去。
4. 统计数量
数一数:某个值出现了几次、有几个不重复、某列总共多少。
- 按哪一列分组 —— 填
B就是"按客户统计",结果里一行代表一个客户。可以填几列(逗号隔开,如A,B)做多级分组。留空 = 不分组,整表只出一行总计。 - 统计哪一列 —— 求和/平均值/最大值/最小值/去重个数都针对这一列。只数行数的话可以不选(选第一项"(不选,只数行数)")。
- 统计什么 —— 勾你要的:行数、非空个数、去重个数、求和、平均值、最大值、最小值。
- 结果排序 —— 默认保持出现顺序;选「次数从多到少」,一眼看出哪个最多。
举个例子,按客户分组统计订单:
| 客户 | 数量 行数 | 数量 求和 | 数量 平均值 |
|---|---|---|---|
| 甲 | 4 | 12 | 3 |
| 乙 | 2 | 3 | 3 |
| 丙 | 1 |
三个细节值得知道:
- 归一化依然生效 ——
甲和甲␣(尾部带空格)算同一个客户,不会拆成两组。 - 求和/平均只认能当数字用的值 —— 文本(比如
abc)和空值会被跳过,"平均值"的分母是有效数字的个数,不是行数。所以上面乙组的平均值是 3 而不是 1.5。 - 「行数」和「非空个数」不是一回事 —— 行数含空行,非空个数不含。
最常用的一招:想知道"哪些商品编码重复了、各重复几次",就按商品编码分组 → 只勾「行数」→ 排序选「次数从多到少」。比在 Excel 里拉数据透视表快。
5. 列种类
只看某一列到底有几种不同的值、各出现几次、占多少。比"统计数量"更直接 —— 一次只干一件事,填一列点一下就出结果。
- 看哪一列 —— 填列号(
A)或列名都行,默认 A 列。 - 结果里显示 —— 勾「占比(%)」多一列百分比;勾「所在行号」多一列行号,回头找重复项时特别省事(它直接告诉你第 2、5、8、13 行是这个值)。
- 结果排序 —— 次数从多到少/从少到多/按值 A→Z/按值 Z→A/首次出现顺序。
出来长这样(看"商品编码"列):
| 商品编码 | 出现次数 | 占比(%) | 所在行号 |
|---|---|---|---|
| P002 | 12 | 40.0 | 2,3,7,9,11,14,18,20,23,25,28,31 |
| P001 | 9 | 30.0 | 4,5,8,12,15,19,22,26,30 |
| P003 | 6 | 20.0 | 6,10,13,17,21,27 |
| (空白) | 3 | 10.0 | 16,24,29 |
预览页上方会给出汇总:
【列种类】商品编码 列共 30 行,3 种不同值;空白 3 行,出现多次的 3 种。 最多:P002(12 次)。
三个规则:
- 归一化照样生效 ——
P002、P002(带空格)、p002算同一种,显示的是它第一次出现的原样。要拆开就关掉上面那四个宽容开关(严格模式)。 - 空白算一种,永远排最后 —— 空串、空格、制表符、不换行空格、全角空格、零宽空格全都并成同一组「(空白)」,不会冒出一堆"看着都空、却分成好几组"的怪东西。
- 数字按大小排,不按字符串排 —— 「按值 A→Z」用在数字列上,
2会排在9前面、9排在10前面(按字符串排的话10会跑到2前面,很难看)。
「种类数」这个数字在哪看?就在预览页上方那句话里。A 列一共 8 种,比数重复项有用得多。
6. 文本清洗
对付"看着一模一样却匹配不上"的脏数据。这是从别处复制粘贴来的表格最常见的坑:
| 你看到的 | 实际存的 | 勾这个 |
|---|---|---|
1001 | 1001(全角) | 全角转半角 |
张三 | 张 三(中间有空格) | 去掉所有空格 |
ABC | abc | 转大写 |
1.5 | 1.50 | 数值去掉多余小数位 |
清洗完再导出,或者清洗后另存一份当数据源。
四、匹配的"宽容度"—— 这工具最值钱的地方
表格对不上,九成不是数据错了,是格式不一样。「匹配查找」页里那四个勾选框,默认全开:
| 选项 | 效果 | 例子 |
|---|---|---|
| 忽略空格 | 所有空格、换行、制表符、不换行空格都不算 | 张 三 = 张三 |
| 忽略大小写 | 字母大小写视为相同 | abc = ABC |
| 全角半角等价 | 全角转半角后比较 | ABC = ABC、123 = 123 |
| 数值等价 | 数字的写法不同但值相同 | 1.0 = 1 = 1e0、1,234 = 1234 |
全勾上就是最宽松的匹配,一般不用改。什么时候要改?
- 你的编号是
A-001和a-001这种大小写有意义的 → 去掉"忽略大小写" - 数据里真的存在
1和1.0两个不同条目 → 去掉"数值等价" - 想查"格式完全一致的重复项" → 四个全去掉(严格模式)
五、两种特殊情况
查找列里同一个值出现了多次
比如 A 列有两个"张三",一个在技术部一个在市场部。C 列查"张三"该返回哪个?
「特殊情况」里选:
- 取第一个(默认)—— 返回先出现的那个
- 取最后一个 —— 返回后出现的那个
- 全部连起来 ——
技术部 / 市场部,一眼看出有多个 - 标记为"多个" —— 直接写
多个(2),提醒你这里有歧义要人工处理
建议:数据量大的时候先用"标记为多个"跑一遍,看看有没有潜在的匹配歧义,再决定用哪个策略。
没找到的时候
- 留空(默认)—— 什么都不写,配合 √/× 标记列看
- 填一段文字 —— 写上"未找到",导出后一眼能筛出来
- 保留原值 —— 目标列原来的内容不动
六、哪些格式能用
| 操作 | 格式 | 说明 |
|---|---|---|
| 读取 | .xlsx .xlsm | Excel 和 WPS 都能存这两种,首选 |
| 读取 | .csv | 自动识别 UTF-8 / GBK 编码,逗号/分号/制表符分隔都能认 |
| 写出 | .xlsx .csv | 出来的文件 Excel、WPS 都能直接打开 |
| 不支持 | .xls .et .xlsb | 老格式和 WPS 私有格式 |
遇到 .xls 或 .et 文件怎么办?
在 Excel 或 WPS 里打开它,「另存为」→ 选 .xlsx,然后用本工具处理。这一步只需要做一次。
为什么不做 .xls 支持?那是 20 多年前的二进制格式,解析库又老又容易读错公式和日期。转成 xlsx 是最省事也最可靠的路子。
几个实操细节:
- 公式:工具读的是公式的计算结果,不是公式本身。如果表格里全是公式、又从来没保存过,可能读出空白 —— 在 Excel/WPS 里正常保存一次即可。
- 多工作表:文件名旁边有「工作表」下拉框,可以选具体哪一页。
- 首行是表头:默认勾选。如果你的表没有表头(第一行就是数据),把勾去掉,列名会用 A、B、C 代替。
- 合并单元格:只有左上角那格有值,其余是空的。这是 Excel 本身的特性,不是工具的 bug。处理前建议先取消合并、填充好再整理。
七、常见问题
Q:导出的文件在哪?
你点「导出结果…」时选的位置。默认文件名是 原文件名_整理结果.xlsx,放在和原文件同一个目录。
Q:结果预览只显示了 300 行 / 40 列,是不是只处理了这么多?
不是。预览只显示前 300 行方便看,实际处理的和导出的都是整张表(预览页会写清楚)。列超过 40 列时预览也只显示前 40 列,但导出一列不少。
Q:能撤销吗?
处理结果只存在内存里,重新点一次「开始匹配」就会覆盖上一轮结果。要留住哪一轮,先导出。
Q:会不会改坏我的原文件?
不会。全程只读原文件,结果一律另存。你甚至可以拿原文件在别的表格软件里开着,同时用这个工具处理。
Q:想批量处理一堆文件?
界面暂时只做单文件。如果真有这需求跟你说 —— 它底层是命令行的,可以写脚本批处理:
表格整理工具.exe match --file 表.xlsx --src-col C --look-col A --value-col B --to-col D --out 结果.xlsx
六个动作分别对应 match(匹配)/diff(比对)/dedupe(去重)/stat(统计)/kinds(列种类)/clean(清洗),
用 --help 能看到全部参数。比如统计数量:
表格整理工具.exe stat --file 表.xlsx --group-cols B --stat-col D ^
--stat-ops count,sum,avg --stat-sort count_desc --out 统计结果.xlsx
列种类(看 A 列有几个品种):
表格整理工具.exe kinds --file 表.xlsx --kind-col A ^
--kind-sort count_desc --with-rows --out 种类结果.xlsx
八、改代码之后怎么自检
# 功能校验(231 项)
C:\Users\你的用户名\.workbuddy\binaries\python\envs\gui\Scripts\python.exe test_table_tidy.py
# 界面布局校验(确认控件没被挤出窗口)
C:\Users\你的用户名\.workbuddy\binaries\python\envs\gui\Scripts\python.exe verify_gui.py
# 重新生成图标
...\python.exe make_icon.py
# 重新打包(打包前先清 build,见下面的说明)
打包命令:
...\Scripts\pyinstaller.exe --noconfirm --onefile --windowed ^
--name TableTidy --icon app.ico --hidden-import openpyxl ^
--distpath dist --workpath build table_tidy.py
打包前先清空build目录(分批删,每批不超过 45 个文件)。
别用--clean参数:它会批量删除几十个临时文件,触发系统批量删除保护,进程直接被拦死。
打包出来的是dist\TableTidy.exe,记得手动改名成表格整理工具.exe(改名前verify_package.py也能认)。
打完必须跑一遍验收:python verify_package.py—— 它会比对"exe 输出"和"源码输出"是否逐格一致、
确认 GUI 能起来不闪退、并探针验证 openpyxl 确实打进了包里。
*工具版本 v1.2.0 · 2026-09-22*
(v1.1.0 新增「统计数量」;v1.2.0 新增「列种类」)