跳到主要内容

从混排文本里抠出数字

从混排文本里抠数字,是报表整理里的高频需求:单价 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

五、一次处理整列​

正则在单元格里对整列做,很容易拖慢工作簿。稳妥顺序:

  1. 辅助列写公式,下拉;
  2. 复制辅助列 → 选择性粘贴"值";
  3. 删辅助列。

数组公式(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 后 --

同一张表里尽量用同一种方案。三种混着用,三个月后你自己都读不懂。