ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Excel转CSV为什么总是乱码?从编码到分隔符的完整处理原理

Excel转CSV为什么总是乱码?从编码到分隔符的完整处理原理

用 Excel 转 CSV,最常见的两个翻车现场:用记事本打开中文全乱码,或者一列里含逗号的数据被劈成好几列。前者是编码问题(UTF-8 vs GBK),后者是分隔符转义问题。这篇从底层讲清楚:xlsx 到底存了什么、CSV 为什么"没有标准"、以及一张 Excel 变 CSV 时踩过的 6 个隐藏的坑,最后给出一套在代码里稳定转换的完整方案。面向想搞懂数据互转原理的开发者。

一、CSV 到底是什么?为什么它总出幺蛾子

CSV 全称 Comma-Separated Values(逗号分隔值)。它的"标准"其实从来没有统一过——RFC 4180 只是民间约定,Excel、Python、各种系统对它各有一套实现。核心约定如下:

规则 说明
每行一条记录 换行分隔
逗号分隔字段 缺省分隔符
含逗号的字段加引号 "a,b"
含引号的字段加倍引号 "" 转义
无统一编码 GBK / UTF-8 / UTF-8 BOM 都有人用

乱码的根源就在"无统一编码":Windows 记事本默认按 ANSI/GBK 解码,而工具导出的可能是 UTF-8 无 BOM 的 UTF-8,两边对不上,中文就变"鋙"这样的乱码。

关键结论:CSV 的问题是"没有唯一标准"。谁生成、用啥编码、用什么分隔符都不固定,所以在你"打开"的那一刻,其实是一种解码猜测。误解必然会碰到 BOM/GBK/UTF-8。

二、xlsx 内部到底是什么

与 CSV 纯文本不同,xlsx 就是一个 ZIP 包(SpreadsheetML)。里面:

xl/worksheets/sheet1.xml   # 每个工作表
xl/sharedStrings.xml       # 共享字符串表(文本)
xl/workbook.xml            # 表名、顺序

文本存在 sharedStrings.xml 里,单元格通过索引引用。数值直接在单元格。这意味着 Excel 转 CSV 不只是"复制粘贴",而是把 XML 结构转成纯文本,中间有大量边界情况。

三、转换的 6 个重点坑

1. 编码(乱码罪魁)

导出的 CSV 需要明确编码。如果目标用户用 Excel/记事本打开中文,最好加 BOM:

UTF-8 with BOM(即文件开头有 EF BB BF,记事本能识别为 UTF-8)

不加 BOM 的 UTF-8 在记事本是乱码,GBK 在 Excel <2016 也会乱。统一办法:输出 UTF-8 with BOM

2. 分隔符冲突

字段内含逗号(如 "Jidd, Alibaba")必须加引号,否则会被拆列。CSV 标准的转义规则:

import csv
row = ['a', 'x,y', '"q"', '中文']
csv.writer(f).writerow(row)
# 自动输出: a,"x,y","""q""",中文

3. 引号转义

字段内含引号需翻倍 ""。许多手工拼接的 CSV 没处理,Excel 打开就乱。

4. 换行与 CRLF

CSV 多行字段(单元格内有换行)要用引号包住。行结束符推荐 CRLF(\r\n),文件符合 RFC 4180 能正确交叉。

5. 数字精度与格式

Excel 里单元格的 15 位数字精度、日期序列号会被导出成 45321 这样的数值,而不是显示日期。转换时若不处理日期格式化,CSV 会出现无意义数字。

6. 合并单元格 / 多 sheet

CSV 是单工作表,合并单元格 / 多 sheet 都要降级:要么只导首个 sheet,要么把合并单元格只写第一个值。

四、推荐:统一用 csv 模块/封装,别手拼

手动用字符串拼接最容易出上面所有错。成熟语言原生 csv 库都内置了转义规则。Python 标准库 csv 是其中之一:

import csvdef to_csv(data, path):with open(path, 'w', newline='', encoding='utf-8-sig') as f:writer = csv.writer(f)for row in data:writer.writerow(row)

encoding='utf-8-sig' 自动加 BOM,newline='' 保证 CRLF 正确。这样编码、引号、分隔符三个大坑一次解决。

关键结论不手动拼字符串拼 CSV。用 encoding='utf-8-sig' + csv writer,把编码(BOM)、字段引号转义一起全部交给库处理。自己写拼接极易踩上述坑。

五、落地:自建 vs 在线工具

维度 自建 在线工具
上手 需写代码处理 上传即用
编码控制 自己控制 服务端封装好
批量 脚本化 单次
多 sheet 需自己处理 一般取第一个

比如 91aitool.cn 的 Excel转CSV 工具,走服务端方案,上传 .xls/.xlsx 直接输出 UTF-8 CSV,自动处理好编码和转义。适合不想写代码、偶尔导一次数据的人。

六、常见问题

为什么我导出的 CSV 用记事本打开是乱码?

缺少 BOM 或编码不对。用 UTF-8 with BOM 输出再打开。

为什么含逗号的字段被劈成两列?

字段没加引号。用 csv 库自动加引号即可。手动拼接要自己处理逗号和引号。

为什么日期变成数字 456…?

Excel 日期是序列号,转换时不格式化就会输出数值。

能保留多个工作表吗?

CSV 就只有一张表,多 sheet 要么合并、要么只导出第一 sheet。

七、总结

Excel 转 CSV 的核心坑就是编码、分隔符、转义、日期这四件事。CSV 没有统一规范,谁是"标准"很大程度取决于哪个工具打开它。稳妥做法是用 UTF-8 with BOM 输出 + 用 csv 库处理转义,而不是手拼字符串。理解了这四层,无论自建还是用在线服务,都能拿到可预期、不烂的表。

参考资料

  • RFC 4180(CSV 参考格式)
  • Python csv 模块官方文档
  • ECMA-376(xlsx/SpreadsheetML 结构)
返回列表