跳到工具
ViewCSV
无需上传文件

用 Excel 打开 CSV 时,保住长数字和开头的 0

这里其实是两件事。长数字显示成 4.02177E+19,可能只是显示格式问题,把列拉宽或改成“数值”格式就能看到更多位。但 Excel 打开 CSV 时还会转换值本身:数字单元格只保留 15 位有效数字,开头的 0 也不属于数字的一部分。已经被替换掉的数字,靠改格式找不回来。要保住这些值,就得在 Excel 转换之前让它们成为文本单元格:导入时把这些列设为文本,或者直接打开单元格已经是文本的 XLSX,比如 CSV 转 Excel 默认生成的工作簿。

Excel 会把一份编号、代码文件改成什么样

CSV 是不带单元格类型的纯文本。双击打开时,Excel 会逐个猜测每个值是数字、日期还是文本。下面这份虚构的文件里,放的都是最容易被猜错的几类值。

值的类型CSV 中的原值Excel 直接打开 CSVViewCSV 生成的 XLSX 单元格
开头带 0 的编号0041241200412
20 位订单号402177300911524000164.02177E+1940217730091152400016
下一个订单号402177300911524000174.02177E+1940217730091152400017
带加号的电话号码+1555010023415550100234+15550100234
像日期的零件代码3-1212-Mar3-12
含字母 E 的批次号12E31.20E+0412E3
像公式的备注=SUM(F2:F3)17=SUM(F2:F3)
在区域设置为“英语(美国)”的 Excel 中双击打开文件时的典型结果。中文区域设置下日期顺序和显示方式不同,例如 3-12 通常会显示为 3月12日;其他版本的结果也可能略有差异。

两个订单号都显示为 4.02177E+19,但这只是显示效果。在底层,Excel 只保留了它们的前 15 位,两个单元格现在存的是同一个值 40217730091152400000。把列拉宽后看到的是这些 0,而不是原来的数字;VLOOKUP 查找或删除重复项时,两笔订单也会被当成一笔。

这些行就是转换工具自带的示例。下载这份 CSV,用你自己的 Excel 打开对比一下。

打开CSV 转 Excel下载示例 CSV4 行虚构数据,UTF-8 编码

科学计数法只是显示,丢掉的位数却是真的

4.02177E+19 只是“常规”格式的列太窄时大数字的显示方式,把列拉宽或改用“数值”格式就能看到更多位。真正的损失发生得更早:Excel 存储数字的精度是 15 位有效数字,转换时第 16 位起的每一位都会变成 0。纯数字的 18 位身份证号、16 到 19 位的银行卡号,最后几位都会因此丢失。

  • 开头的 0 会消失,因为 00412 和 412 是同一个数。自定义格式 00000 能让它重新显示成五位,但单元格里存的仍是 412,长度不一的编号也没法这样还原。
  • 长编号 第 15 位之后的数字全部丢失。文件一旦在改动后保存,任何格式、公式或工具都无法把它们找回来。
  • 3-12、12E3 这类代码 会变成日期或科学计数法的数字,单元格里已经没有原来的文本。
  • 以 = 开头的值 会被当作公式,替换成计算结果。
注意 把工作表另存回 CSV,会把改动后的值写进文件。如果有人在 Excel 里打开并保存过这份 CSV,请与最初导出的文件对比:CSV 里的数字一旦变成 0,就再也回不来了。

改为生成带文本单元格的 XLSX

与 CSV 不同,.xlsx 工作簿会为每个单元格记录类型,文本单元格在 Excel 里会原样显示。CSV 转 Excel 默认把每个值都写成文本单元格。它在浏览器本地运行,不会上传文件。

  1. 在 CSV 转 Excel 中打开你的 CSV,或者点 用示例试试 载入上面那几行。
  2. 查看 输入 下的表格:编号、开头的 0 和各种代码都和文件里一模一样。
  3. 值类型 保持为 所有值都保留为文本。
  4. 点 下载 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 版本中的菜单名称可能有所不同。

更多教程

CSV 与 Excel 教程