这里其实是两件事。长数字显示成 4.02177E+19,可能只是显示格式问题,把列拉宽或改成“数值”格式就能看到更多位。但 Excel 打开 CSV 时还会转换值本身:数字单元格只保留 15 位有效数字,开头的 0 也不属于数字的一部分。已经被替换掉的数字,靠改格式找不回来。要保住这些值,就得在 Excel 转换之前让它们成为文本单元格:导入时把这些列设为文本,或者直接打开单元格已经是文本的 XLSX,比如 CSV 转 Excel 默认生成的工作簿。
Excel 会把一份编号、代码文件改成什么样
CSV 是不带单元格类型的纯文本。双击打开时,Excel 会逐个猜测每个值是数字、日期还是文本。下面这份虚构的文件里,放的都是最容易被猜错的几类值。
| 值的类型 | CSV 中的原值 | Excel 直接打开 CSV | ViewCSV 生成的 XLSX 单元格 |
|---|---|---|---|
| 开头带 0 的编号 | 00412 | 412 | 00412 |
| 20 位订单号 | 40217730091152400016 | 4.02177E+19 | 40217730091152400016 |
| 下一个订单号 | 40217730091152400017 | 4.02177E+19 | 40217730091152400017 |
| 带加号的电话号码 | +15550100234 | 15550100234 | +15550100234 |
| 像日期的零件代码 | 3-12 | 12-Mar | 3-12 |
| 含字母 E 的批次号 | 12E3 | 1.20E+04 | 12E3 |
| 像公式的备注 | =SUM(F2:F3) | 17 | =SUM(F2:F3) |
3-12 通常会显示为 3月12日;其他版本的结果也可能略有差异。两个订单号都显示为 4.02177E+19,但这只是显示效果。在底层,Excel 只保留了它们的前 15 位,两个单元格现在存的是同一个值 40217730091152400000。把列拉宽后看到的是这些 0,而不是原来的数字;VLOOKUP 查找或删除重复项时,两笔订单也会被当成一笔。
这些行就是转换工具自带的示例。下载这份 CSV,用你自己的 Excel 打开对比一下。
科学计数法只是显示,丢掉的位数却是真的
4.02177E+19 只是“常规”格式的列太窄时大数字的显示方式,把列拉宽或改用“数值”格式就能看到更多位。真正的损失发生得更早:Excel 存储数字的精度是 15 位有效数字,转换时第 16 位起的每一位都会变成 0。纯数字的 18 位身份证号、16 到 19 位的银行卡号,最后几位都会因此丢失。
- 开头的 0 会消失,因为
00412和412是同一个数。自定义格式00000能让它重新显示成五位,但单元格里存的仍是 412,长度不一的编号也没法这样还原。 - 长编号 第 15 位之后的数字全部丢失。文件一旦在改动后保存,任何格式、公式或工具都无法把它们找回来。
3-12、12E3这类代码 会变成日期或科学计数法的数字,单元格里已经没有原来的文本。- 以
=开头的值 会被当作公式,替换成计算结果。
改为生成带文本单元格的 XLSX
与 CSV 不同,.xlsx 工作簿会为每个单元格记录类型,文本单元格在 Excel 里会原样显示。CSV 转 Excel 默认把每个值都写成文本单元格。它在浏览器本地运行,不会上传文件。
- 在 CSV 转 Excel 中打开你的 CSV,或者点 用示例试试 载入上面那几行。
- 查看 输入 下的表格:编号、开头的 0 和各种代码都和文件里一模一样。
- 值类型 保持为 所有值都保留为文本。
- 点 下载 XLSX,再用 Excel 打开这个工作簿。
在工作簿里,00412、两个订单号的全部 20 位、+15550100234、3-12、12E3 和 =SUM(F2:F3) 都是文本单元格。像公式的值按纯文本存储,打开文件时不会计算。Excel 可能会在像数字的文本左上角标一个绿色小三角(“以文本形式存储的数字”),值本身没有变化。
quantity 或 unit_price 计算,请看下一节,不要在 Excel 里整列转换,否则一不小心选中的编号列也会被一起转成数字。同时需要真正的数字时
识别数字和 true/false 只在某一列的所有值都是 Excel 能原样存储的普通数字时,才把这一列设为数字。在示例中,quantity 和 unit_price 会变成数字,而 customer_id(开头有 0)、order_ref(超过 15 位)、part_code 和 note 仍是文本。
识别看的是值的写法,而不是它的含义,并且按整列判断。如果一列全是 +15550100234 这样的值,会被当成带正负号的整数;全是 12E3 这样的值,则会被当成科学计数法。因此在示例里,phone 和 lot_code 也会变成数字。遇到这类文件,请保持默认设置,只在 Excel 里转换数量单元格:选中它们,在警告图标的菜单里选 转换为数字。
如果只能在 Excel 里从 CSV 开始
如果没法用转换好的工作簿,就不要双击 CSV,而是用导入功能,在加载之前把有风险的列设为文本。在当前的 Microsoft 365 版 Excel 中,步骤是 数据 > 从文本/CSV > 转换数据,删除自动添加的 更改的类型 步骤,把编号列设为文本,然后加载。CSV 导入 Excel 教程 详细讲解了这种方法和旧版的文本导入向导。
较新的 Microsoft 365 版 Excel 和 Excel 2024 还在数据选项中提供了“自动数据转换”设置,可以阻止开头的 0、长数字、E 记数法和像日期的文本被转换。具体有哪些选项、叫什么名字,取决于版本和平台;而且这些设置只影响你自己的 Excel,不会改变同事那边的。
这些做法保护不了数据
- 给值加引号(
"00412")只是告诉 CSV 读取程序一个值从哪里开始、到哪里结束。加了引号的数字,Excel 照样转换。 - UTF-8 BOM(字节顺序标记) 能帮 Excel 正确识别中文等字符,避免乱码,但它与单元格类型无关。
- 打开后再把列设为文本格式 为时已晚,转换已经发生了。
="00412"这样的公式写法 只在会计算公式的电子表格里有效。其他 CSV 读取工具、数据库和脚本看到的是字面文本="00412",文件里的数据已经不是那个编号了。- 开头加单引号(
'00412)不是公式:在 Excel 里手动输入时,它把内容标记为文本,本身不显示。但在 CSV 文件里它只是一个普通字符,其他程序读到的值就是'00412。 - XLSX 中真正的文本单元格 保存的就是纯粹的
00412,不多任何字符。转换工具写出的正是这种单元格,所以 ViewCSV 既不加公式包装,也不加单引号。
使用限制
转换工具可处理最大 25 MB、100,000 行、250 列、200 万个单元格的文件,每个工作簿一张工作表。已经以舍入后的编号或去掉 0 的形式保存过的文件,转换也修复不了,请从原始系统重新导出。ViewCSV 的测试会用一个独立的读取程序检查生成的 XLSX 中的单元格类型;不同 Excel 版本在屏幕上的显示格式可能有所不同。
参考资料
内容参考 Microsoft 官方文档,并用我们自己的话进行了归纳。你的 Excel 版本中的菜单名称可能有所不同。