如何从不同长度的Excel字符串中提取特定卡路里数据?
Excel提取D列卡路里数值的实用方案
针对D列字符串长度不一致导致MID函数失效的问题,以下是几种适配不同Excel版本的解决方法:
方法1:使用REGEXEXTRACT(Excel 365及以上版本)
直接通过正则匹配提取“卡路里”前的数字,无需考虑字符串长度,是最简便的方案:
=REGEXEXTRACT(D2,"(\d+)卡路里")
- 原理:匹配任意长度的数字(
\d+)后跟“卡路里”的模式,提取其中的数字部分 - 使用方式:将公式输入到目标单元格(如E2),下拉填充即可批量提取
方法2:使用TEXTBEFORE+TEXTAFTER(Excel 365/2021及以上版本)
如果卡路里数值前有固定关键词(如“消耗”),可通过两次截取精准提取:
=--TEXTAFTER(TEXTBEFORE(D2,"卡路里"),"消耗")
- 原理:先用
TEXTBEFORE截取“卡路里”前的所有内容,再用TEXTAFTER截取“消耗”后的部分,--将文本转为数值 - 适配场景:D列内容格式统一包含固定触发词(如“消耗XX卡路里”)
方法3:使用FILTERXML(兼容Excel 2013及以上版本)
适合没有正则功能的旧版Excel,通过XML解析提取数值:
=INDEX(FILTERXML("<t><s>"&SUBSTITUTE(D2," ","</s><s>")&"</s></t>","//s[number(.)=.]"),COUNTA(FILTERXML("<t><s>"&SUBSTITUTE(D2," ","</s><s>")&"</s></t>","//s[number(.)=.]")))
- 原理:将字符串按空格拆分XML节点,筛选出所有数值节点,取最后一个(通常对应卡路里数值)
- 使用方式:旧版Excel需按
Ctrl+Shift+Enter作为数组公式输入,新版直接回车即可
方法4:传统组合函数(兼容所有Excel版本)
通过SEARCH、MID和数组判断实现,无需依赖新函数:
=--MID(D2,MAX(IF(ISNUMBER(--MID(D2,ROW($1:$100),1)),ROW($1:$100),0))-LEN(TEXT(--MID(D2,MAX(IF(ISNUMBER(--MID(D2,ROW($1:$100),1)),ROW($1:$100),0)),LEN(D2)-MAX(IF(ISNUMBER(--MID(D2,ROW($1:$100),1)),ROW($1:$100),0))+1,"#"))+1,LEN(TEXT(--MID(D2,MAX(IF(ISNUMBER(--MID(D2,ROW($1:$100),1)),ROW($1:$100),0)),LEN(D2)-MAX(IF(ISNUMBER(--MID(D2,ROW($1:$100),1)),ROW($1:$100),0))+1,"#")))
- 原理:遍历字符串找到最后一段连续数字的起始和结束位置,用
MID截取后转为数值 - 使用方式:必须按
Ctrl+Shift+Enter作为数组公式输入
内容的提问来源于stack exchange,提问作者Bartosz Kowalczyk
相关产品推荐
相关产品推荐

