文本拼接:连接符、CONCAT 和 TEXTJOIN

三种拼接手段怎么选与深入对比

文本拼接三种手段怎么选

把两格文字拼成一格,Excel 给了三条路:连接符 &、函数 CONCAT、函数 TEXTJOIN。很多人用了几年只知道 &,遇到要拼二十列的时候就开始疯狂敲符号,敲完发现空格忘了加、日期变成了一串数字、空单元格后面拖着一串多余的分隔符。其实这三条路各有分工,选对了能省掉八成的返工,选错了就是每天多花十分钟在改公式。

连接符 & 的优势是直觉。你只需要写 =A2&B2,公式栏里出现什么结果就是什么,不用记参数顺序,也不需要挑 Excel 版本。它的劣势同样明显:每拼一项就要多敲一次 &,拼五列就要敲四次,中间还要穿插分隔符的文本常量,公式一长就很难读,改起来更痛苦,尤其是半年后你自己回头看的时候。

CONCAT 是 CONCATENATE 的升级版,从 Excel 2019 起提供,作用是把它后面列出的所有文本或区域按顺序连起来,中间不插任何分隔符。它的价值在于可以直接吃一个区域:=CONCAT(A2:F2) 就能把这六格连成一串,比写五个 & 清爽得多,也更容易复制填充。但它也有硬伤,那就是完全无视空单元格的同时也不会补分隔符,两个内容之间会毫无征兆地粘死。

TEXTJOIN 是目前最值得优先掌握的一个。它同时解决了分隔符和空值两个问题,语法是 =TEXTJOIN(分隔符, 是否忽略空单元格, 文本1, [文本2], ...)。第二个参数写 TRUE 就自动跳过空白格和空字符串,写 FALSE 则保留位置。日常做地址合并、标签生成、多条件键拼接、清单汇总,几乎都应该用它。

手段 语法示例 分隔符处理 空单元格处理 推荐场景
连接符 & =A2&" "&B2 手动加文本常量 会拼出多余分隔符 两三项的快速拼接
CONCAT =CONCAT(A2:F2) 不支持自动分隔 跳过但无分隔 把连续区域直接粘成一串
TEXTJOIN =TEXTJOIN("-",TRUE,A2:F2) 第一参数统一指定 第二个参数控制 多列合并、生成编码和标签
PHONETIC =PHONETIC(A2:F2) 不支持 跳过 兼容老文件时偶尔可见

表格里最后一行提到的 PHONETIC 原本是日文版里取拼音注音的函数,在中文环境里被当作合并连续区域文本的野路子用了很多年。它的行为不受官方保证,遇到数字和设置了数字格式的单元格经常直接丢掉内容,新写公式一律不要用,只是你打开别人留下的老表时要认得它,才不会对着一个陌生函数发懵。

判断该用哪一个,可以用一句很简单的话概括:只拼两三项用 &,拼一整片连续区域且不需要分隔用 CONCAT,其余所有情况优先 TEXTJOIN。这条经验能覆盖日常九成的拼接需求,剩下的特殊情形再单独处理。

连接符与 CONCAT 的深入对比

连接符 & 在运算优先级上低于加减乘除,这意味着 =A2&B2+1 会先算 B2+1 再拼接。如果你要拼的两段里有算术运算,务必用括号明确顺序,写成 =A2&(B2+1)。这个坑在拼接带小计的文本时特别常见,比如 ="合计:"&B2+C2 出来的结果往往是先相加再拼,而大多数人想要的是拼两段数字。

连接符还有一个隐藏能力:它可以直接拼接比较运算的结果。=A2&B2 里如果 B2 是 TRUE 或 FALSE,拼出来就是大写的 TRUE 或 FALSE 字符串。想让结果更友好,需要外套一层 IF,写成 =A2&IF(B2="","",B2) 这样的形式,让空值不留下痕迹。

CONCAT 相比老函数 CONCATENATE 的最大改进是支持区域引用。CONCATENATE 最多只能接受二百五十五个参数,且必须是逐个单元格或常量,写 =CONCATENATE(A2:F2) 虽然语法上允许,但实际拿到的是六个独立参数,拖着填充时会逐个错位。而 CONCAT 是真正把区域当成一个整体来处理,行为稳定得多。

需要提醒的是,CONCAT 不会忽略空字符串但会真的跳过空白单元格,两者表现不同。如果某格里是公式返回的空字符串,它依然会被拼进去,只是肉眼看不出来。这也是为什么在需要严格控制结果长度的场景里,TEXTJOIN 的第二个参数更值得信赖。

TEXTJOIN 的参数细节与可复制写法

TEXTJOIN 的三个参数里,前两个最容易出错。分隔符必须用英文双引号包起来,比如 =TEXTJOIN("-",TRUE,A2:C2);如果分隔符本身是空格,就写 =TEXTJOIN(" ",TRUE,A2:C2);如果要换行,分隔符可以写成 CHAR(10),前提是单元格设置了自动换行,否则你会看到一个小方块而不是真正的换行。

第二个参数强烈建议固定写 TRUE。写 FALSE 的典型后果是:某条记录只有省和市没有区县,结果拼出来是“广东省深圳市--南山区”,中间两个分隔符孤零零地挂着,下游做查找匹配的时候必然对不上,排查起来又要花掉半小时。

第三个参数开始,你可以逐个列出文本,也可以直接给区域,还可以混着写,最多支持二百五十二个待拼接项。下面这几个写法都可以直接复制使用,覆盖绝大多数场景:

=TEXTJOIN("-",TRUE,A2:C2)
=TEXTJOIN("",TRUE,A2:A50)
=TEXTJOIN(",",TRUE,IF(D2:D20="是",B2:B20,""))
=TEXTJOIN("/",TRUE,A2,B2,TEXT(C2,"0.00"))
=TEXTJOIN("、",TRUE,FILTER(B2:B100,A2:A100="华东"))
=TEXTJOIN(CHAR(10),TRUE,A2:A10)

注意第三个写法用 IF 先做了一层筛选再拼接,在 Excel 2019 和 Microsoft 365 里通常能直接回车出结果,在更早的版本里需要按 Ctrl + Shift + Enter 组合键确认,这就是所谓的三键数组公式。如果公式结果显示成了单个值而不是一长串,八成是这一步没做对,重新选中单元格进入编辑状态再按一次三键即可。

最后一个用 CHAR(10) 的写法在生成多行文本时非常顺手,比如把一列姓名压成一个单元格里的多行名单,方便直接复制到聊天窗口或邮件正文。前提是目标单元格勾了自动换行,否则换行符只显示成一个小黑块。

拼接时最常踩的五个坑

文本拼接最常踩的五个坑

第一个坑是数字和日期拼完变样。日期在 Excel 里本质是序列号,直接拼会得到 45291 这种五位数。正确做法是用 TEXT 先格式化:="报告日期:"&TEXT(A2,"yyyy-mm-dd")。金额同理,想保留两位小数就写 ="合计:"&TEXT(B2,"#,##0.00"),这里的 #,##0.00 是千分位加两位小数的格式代码。

第二个坑是数字被吃掉前导零。工号 007 如果本身是数字格式,拼出来只会剩一个 7,而人事系统里往往要求严格匹配三位。要么把源数据改成文本格式重新录入,要么在公式里补 ="编号:"&TEXT(A2,"000"),用 TEXT 强行补到三位,不够的位补零。

第三个坑是空格被忘掉。中文姓名中间没有空格,但中英文混排时经常需要在两段之间插一个半角空格。很多人忘了加,结果 =A2&B2 出来是“张伟Sales”,看起来像系统出错了。记住分隔符是字符串常量,必须自己写进公式,Excel 不会替你脑补任何间隔。

第四个坑是拼接结果无法参与后续计算。拼出来的东西一律是文本,哪怕看起来是 1234,拿去和真正的数字比较大小也会失败,用 VLOOKUP 去查找也常常返回错误值。如果后面还要拿这个结果做匹配,建议单独留一列存原始值,拼好的那一列只用于展示和导出,两者分工明确。

第五个坑是整列引用带来的性能问题。写 =TEXTJOIN(",",TRUE,A:A) 会让 Excel 去处理一百零四万行,哪怕绝大多数是空的,也会明显拖慢重算速度。稳妥做法是限定一个合理的上界,比如 A2:A5000,既覆盖了当前数据,又给未来留了余量。

真实场景:地址合并与对账键生成

把省市区和详细地址合成一列

假设导出了一张订单表,A 列是省份、B 列是城市、C 列是区县、D 列是详细地址,E 列是收货人,F 列是电话。有些行缺区县,有些行的详细地址是空的。目标是生成一列完整的收货地址,再生成一列用于快递面单的姓名加电话,最后生成一段可以直接粘贴的发货通知。

完整地址列可以这样写:

=TEXTJOIN("",TRUE,A2:D2)

因为省市区地址本来就不需要分隔符,直接粘起来即可,缺了区县也不会留下双空格。如果希望中间保留一个空格便于阅读,就改成 =TEXTJOIN(" ",TRUE,A2:D2)。这两种写法在同一个表里可以同时保留,一列给系统导入用,一列给人看。

面单列的写法:

=E2&" "&TEXT(F2,"0")

这里对电话用了 TEXT(F2,"0"),因为手机号是十一位数字,直接拼有时会被显示成科学计数法 1.38E+10,打印在面单上完全没法用。加上 TEXT 之后,不管原始单元格是什么格式,出来的都是完整的十一位数字。

再进一步,如果需要生成一段可以直接粘到聊天窗口的发货通知,可以把多行内容拼在一起,用 CHAR(10) 换行:

=TEXTJOIN(CHAR(10),TRUE,"收件人:"&E2,"电话:"&TEXT(F2,"0"),"地址:"&G2)

写完把结果单元格设为自动换行,复制后粘贴到聊天窗口就是三行整齐的文本。注意这里的前缀“收件人:”是写在 TEXTJOIN 的待拼接项里的,而不是塞进分隔符参数,因为分隔符只负责中间那一段,管不到开头。

给每一行生成唯一的对账键

做两张表的核对时,经常需要构造一个唯一键,比如“日期 + 客户编号 + 产品编码”,再用它去另一张表里查找。这时候分隔符的选择很关键,建议用一个在数据里绝不会出现的字符组合,比如 | 或者 #,避免和原始数据里的短横线冲突。

写法如下:

=TEXTJOIN("|",TRUE,TEXT(A2,"yyyy-mm-dd"),B2,C2)

这里的日期同样用 TEXT 规整过,保证两边的格式完全一致。很多人对不上账,根源就是一边日期是 2023/12/1,另一边是 2023-12-01,肉眼看差不多,机器比较时却是两个不同的字符串。

生成好这一列之后,配合查找函数就能完成核对。这里要强调的是分工:拼接只负责把唯一键造出来,查找交给专门的查找函数去做,中间不要试图用一层公式同时解决两件事,否则一旦出错很难定位到底是哪一段出了问题。把中间结果留在工作表里,既能看到每一步的样子,也方便别人接手。

Excel 与 WPS 的兼容提示

TEXTJOIN 在 Excel 2019、Microsoft 365 和 WPS 较新版本里都支持,但 Excel 2016 及更早版本没有这个函数。如果你的表格要发给不确定版本的同事,稳妥做法是退回 CONCAT 或者连接符 &。WPS 表格目前对 TEXTJOIN 的支持是完整的,参数行为与 Excel 一致,包括忽略空值的逻辑和数组形式,都可以放心使用。

CONCAT 的兼容面比 TEXTJOIN 略宽,但同样在 Excel 2016 之前缺失。真正到处都能用的是 CONCATENATE,它从 Excel 2003 就有,缺点是参数只能逐个列、不能吃区域,而且没有忽略空值的能力。老表里见到它不必紧张,照着拆成 & 即可。

如果你需要判断对方版本,最简单的办法是让对方在任意单元格输入 =TEXTJOIN("-",TRUE,1,2),回车后如果显示 1-2 就说明支持,显示 #NAME? 就说明没有。出现 #NAME? 时,把公式改成 =CONCAT(A2:C2) 或者退回连接符写法即可,功能上基本等价,只是要自己处理空值。

另外一个跨平台的注意点是分隔符里的特殊字符。中文顿号、逗号、斜杠在中英文系统里都没问题,但如果你用了 CHAR(10) 换行,在 WPS 打开时偶尔会多出一个空行,删掉一次即可,不影响数据本身。

拼接相关的话题还没完。拼完之后经常会需要从一长串里取出某一段,比如从“广东省深圳市南山区”里截出城市名,那就是 文本截取:LEFT、RIGHT、MID 和 LEN 要讲的活儿。如果拼出来的字符串里混着看不见的空格和换行符,可以先看 文本清洗:TRIM、CLEAN、SUBSTITUTE、REPLACE。

常见问题

为什么 TEXTJOIN 返回 #NAME?

#NAME? 几乎只有一个原因:当前 Excel 版本不认识这个函数。TEXTJOIN 是 Excel 2019 才加入的,Excel 2016 及更早版本、以及部分精简版会直接报这个名字错误。解决办法有三条:一是改用 CONCAT,二是退回连接符 &,三是让对方升级或用 WPS 打开。判断方法很简单,在空白单元格输入 =TEXTJOIN("-",TRUE,1,2),能出 1-2 就支持,出 #NAME? 就不支持。

拼接后日期变成五位数怎么办

日期在 Excel 内部存的是从 1900 年 1 月 1 日起算的序列号,比如 2023-12-01 对应的就是 45261。直接用 & 或 TEXTJOIN 拼接时,Excel 会拿这个序列号当普通数字处理。修法是在拼接前套一层 TEXT:

="下单日期:"&TEXT(A2,"yyyy-mm-dd")

格式代码区分大小写,mm 表示两位数的月份,MM 在部分语言环境下会被理解成分钟,写月份一律用小写 mm。日期格式化的更多写法可以参考 日期基础:TODAY、NOW、DATE 和年月日提取。

能不能只拼接满足某条件的那几行

可以,而且这正是 TEXTJOIN 比 CONCAT 强的地方。思路是先用 IF 把不满足条件的行变成空字符串,再交给 TEXTJOIN 忽略掉:

=TEXTJOIN("、",TRUE,IF(A2:A100="华东",B2:B100,""))

这个公式把 A 列等于华东的所有行的 B 列内容用顿号连成一串。在 Microsoft 365 和 Excel 2021 里直接回车即可;在 Excel 2019 里需要按 Ctrl + Shift + Enter 确认;如果你的版本支持 FILTER,写成 =TEXTJOIN("、",TRUE,FILTER(B2:B100,A2:A100="华东")) 会更直观,也更不容易出错。

分隔符想用换行,为什么只看到小方块

用 CHAR(10) 做分隔符是对的,但 Excel 默认不会把它渲染成换行,除非目标单元格勾选了自动换行。设置方法是选中单元格,按 Ctrl + 1 打开设置单元格格式,在对齐选项卡里勾上自动换行。在 WPS 里同样是右键选择设置单元格格式,找到对齐页签即可。另外要注意,部分 Mac 版 Excel 需要用 CHAR(13),如果 CHAR(10) 无效可以换成它试试。

拼接出来的结果能不能再拆回去

能,但要早做打算。如果拼接时用了固定分隔符,拆分时用数据选项卡里的分列功能,选择分隔符号,填入你当时用的那个字符即可,几秒钟就能拆完。麻烦的是拼接时没用分隔符的情况,那就只能靠长度回推,需要先知道每一段的字数,再用 MID 逐段截取,参见 文本截取:LEFT、RIGHT、MID 和 LEN。所以建议在生成拼接列时,尽量保留一个原始数据列作为备份,避免日后拆不回去。

为什么 TEXTJOIN 忽略空值失败了

通常有两个原因。一是那些看起来是空的单元格,其实装着公式返回的空字符串或者若干个空格,TEXTJOIN 的第二参数只对真正空白的单元格生效,对长度为一的空格串无效。此时要先用 TRIM 清洗一遍,写成 =TEXTJOIN("-",TRUE,TRIM(A2:C2)) 并按三键确认。二是第二个参数被误写成了 FALSE 或者 0,检查一遍公式栏就能发现。