从混排文本里抠出数字
从混排文本里抠数字,是报表整理里的高频需求:单价 128 元/件、数量: 35 箱、2026年10月20日 支出 ¥2,380.50。
按 Excel 版本,有三套方案。
一、结构固定时:MID + FIND 最稳
如果文本有固定分隔符,先定位再截取,是最可控的做法。
取分隔符之间的内容:A2 是 单价 128 元/件,要取 128。
=MID(A2,FIND(" ",A2)+1,FIND("元",A2)-FIND(" ",A2)-1)
拆开看逻辑:
FIND(" ",A2)+1是数字起点;FIND("元",A2)-FIND(" ",A2)-1是数字长度。
得到 "128",外面套 -- 或 VALUE 转成数值:
=--MID(A2,FIND(" ",A2)+1,FIND("元",A2)-FIND(" ",A2)-1)
结构不固定但数字总在末尾:可以用 LOOKUP 找最后一个数字的位置,写法是:
=LOOKUP(9^9,--LEFT(A2,ROW($1:$99)))
这个经典写法的含义是:把左边 1 到 99 个字符逐个试转数值,LOOKUP 找最后一个不报错的结果,也就是"最长能转成数字的前缀"。
注意它只对数字在开头的字符串有效。数字在末尾要反过来处理,比较绕,不如用下一节的方法。
二、Excel 2016+ 或 365:先筛字符再合并
思路是逐个字符判断是否为数字,把数字字符留下。
=TEXTJOIN("",1,IFERROR(ISNUMBER(--MID(A2,ROW($1:$99),1))*MID(A2,ROW($1:$99),1),""))
IFERROR 负责过滤掉非数字字符(-- 转换会报错),TEXTJOIN 把留下的字符拼起来。数组公式,老版本要 Ctrl+Shift+Enter,365 直接回车。
只保留字母或只保留汉字,改一下判断条件即可:
=TEXTJOIN("",1,IFERROR(IF(MID(A2,ROW($1:$99),1)="。","",IF(ISERROR(--MID(A2,ROW($1:$99),1)),MID(A2,ROW($1:$99),1),"")),""))
三、最省心:TEXTSPLIT / REGEXTRACT(新版)
Excel 365 提供了正则相关函数,一次到位:
=REGEXTRACT(A2,"[0-9.]+")
有的版本函数名是 REGEXEXTRACT,取决于发行版。取第一个数字串就能覆盖大部分场景。
WPS 也提供 REGEXP 系列函数,写法类似:
=REGEXP(A2,"[0-9]+")
如果函数不存在,会显示 #NAME?。别急着改公式,先确认版本:在"文件 → 账户"里看更新通道。
四、带千分位、货币符号和百分号
真实数据里数字常带格式:
支出 ¥2,380.50,占比 12.5%
清洗顺序很重要:先去掉非数字字符,再转数值。
=--SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2,"¥",""),",","")," ",""),"%","")
百分号要特别注意:直接去掉 %,12.5 会变成 12%。要保留比例语义,除以 100 或者先把 % 换成空再除:
=--SUBSTITUTE(B2,"%","")/100
五、一次处理整列
正则在单元格里对整列做,很容易拖慢工作簿。稳妥顺序:
- 辅助列写公式,下拉;
- 复制辅助列 → 选择性粘贴"值";
- 删辅助列。
数组公式(ROW($1:$99) 那种)每行要算 99 次,上万行就会明显卡顿。先转值能省掉后续所有重算。
六、常见坑
FIND报#VALUE!:分隔符不存在。用IFERROR兜住,或先IF(ISNUMBER(FIND(...)))判断。FIND区分大小写:找字母用SEARCH更宽松。- 截出来的还是文本:
MID/LEFT/RIGHT永远返回文本,必须--或VALUE。 - 小数点被吃掉了:字符集里漏了
.,写成[0-9.]+。 - 负数丢了负号:字符集补
-,注意-在字符集里放最后或转义。
七、速查
| 场景 | 方案 |
|---|---|
| 分隔符固定 | MID + FIND |
| 数字在前缀 | =LOOKUP(9^9,--LEFT(A2,ROW($1:$99))) |
| 任意位置 | TEXTJOIN + MID 数组 |
| 新版最快 | REGEXTRACT / REGEXP |
| 带格式符号 | 嵌套 SUBSTITUTE 后 -- |
同一张表里尽量用同一种方案。三种混着用,三个月后你自己都读不懂。