CSV ⇄ Excel 安全转换器

用双击的方式在表格软件里打开 CSV,会无声地毁掉数据:前导零消失、长条码变成 8.71E+12MAR1 变成一个日期。这个转换器产出的 .xlsx 里,每一列标识符都已经是文本类型 —— 表格软件根本没有下手的机会。它也能转回干净的 CSV,并把每一处便宜行事都写明,而不是悄悄做掉。

🔒 你的数据不会离开浏览器。解析、保护分析与 xlsx 打包全部在你自己的机器上完成。

🔀

把 CSV 或 .xlsx 文件拖到这里

.csv / .tsv → 安全的 .xlsx · .xlsx → 干净的 CSV · 方向由文件自身判定

Excel → CSV 输出选项

只在 .xlsx → CSV 时用得上。CSV → XLSX 不需要任何配置 —— 保护是自动的。

Excel 为什么会吃掉你的条码,以及这里说的「安全」是什么意思

CSV 文件没有类型 —— 每个单元格都是文本。表格软件一导入它,就会为每个单元格猜一个类型,而这些猜测是毁灭性的:00123 是「数字 123」,于是零被删掉;4006381333931 是个大数,于是显示成 4.00638E+12,而且超过 15 位之后,存下来的值里尾巴直接被换成了零;1-Mar 「显然」是个日期。这些都不会征求你同意,而重新保存会把损坏写回文件。

与 CSV 不同,.xlsx 确实带类型。这个转换器就用这一点:凡是存放标识符的列 —— 带前导零的编码、GTIN/EAN/UPC 列(靠校验位认出来)、邮政编码、电话号码、形状像日期的文本 —— 都会被识别出来并写成文本单元格,表格软件会原样显示它们,绝不重新解释。普通数字(价格、数量)仍然是真正的数字,所以你的表照样能排序和求和。每一列被保护的列都会连同触发的规则和样例值一起列在结果里 —— 它的活儿你可以核。

回来的路:xlsx → CSV 不再产生新的损坏

反方向同样小心。数字绝不会写成科学计数法 —— Excel 以指数形式存下的值会用字符串运算精确展开,不走浮点。日期单元格变成无歧义的 ISO 8601 文本,并采用工作簿自己声明的纪元(老版 Mac Excel 的工作簿从 1904 起算;同一个序列号在两套系统之间相差 1462 天)。公式贡献它最后一次算出的值,合并单元格摊平后值留在左上角 —— 而这些便宜行事每一项都会被数出来、写在结果里,因为「悄悄改动」正是这一切损坏最初的起点。

本工具拒绝做的事

如果你的 CSV 里已经带着 Excel 损坏 —— 本该是条码的地方写着 8.71E+12 —— 转换是换不回那些数位的;它们不在文件里。本工具会如实告警,并把你指向 Excel 损坏诊断,拿到逐个单元格的可恢复性裁定,而不是假装一个看起来干净的 .xlsx 修好了什么。旧版 .xls 与设了密码的工作簿会被明确拒绝并说明原因,而不是被猜着解析。

列保护(7 条规则)

PROT-001前导零已保护

这一列里有以 0 开头的纯数字值(写全前导零的 UPC-12、EAN-8、账号编码)。按数字打开时,表格会静默去掉那些零,标识符从此扫不出来。整列按文本单元格写出。

来源: https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7

PROT-002长数字串已保护

这一列里有 12 位及以上的连续数字。Excel 只保留 15 位有效数字并改用科学计数法显示,于是 GTIN-13 与账号会被弄成 …E+12,或者尾部被补零。整列按文本单元格写出。

来源: https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7

PROT-003GTIN / EAN / UPC 列已保护

这一列的多数值是 8/12/13/14 位、且校验位能通过的编码 —— 这是一列条码,而条码是标识符,不是数量。按文本写出,任何一位数字都不会被重新格式化。

来源: Own engineering rule, derived from documented spreadsheet number handling and the damage signatures catalogued by the Excel damage diagnostic on this site. Each trigger has its own regression fixtures.

PROT-004电话号码已保护

值的形状像国际电话号码(带 + 前缀)。当成数字后,加号、区号的前导零和一切格式都会丢掉。按文本单元格写出。

来源: Own engineering rule, derived from documented spreadsheet number handling and the damage signatures catalogued by the Excel damage diagnostic on this site. Each trigger has its own regression fixtures.

PROT-005像日期的文本按文本保留

值看起来是日期(01/02/2026、1-Mar)。把它们转成表格日期序列号,等于在一个有歧义的格式上静默地选定了一种读法,并改变了实际存下来的东西。原文照原样保留,不做任何重新解释。

来源: Own engineering rule, derived from documented spreadsheet number handling and the damage signatures catalogued by the Excel damage diagnostic on this site. Each trigger has its own regression fixtures.

PROT-006邮政编码已保护

列名点明了这是邮编,而值也是编码的形状。以 0 开头的美国邮编(整个新英格兰地区)是最经典的受害者 —— 07030 会变成 7030。整列按文本单元格写出。

来源: https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7

PROT-007像公式的内容按文本中和

值以 = 或 @(或它们的全角写法)开头。CSV 被表格软件打开时这些会作为公式执行(CSV 注入);写成 xlsx 的文本单元格后它们就是惰性的字面文本。值本身一个字都没删 —— 它按原样、以文本形式存下来。

来源: https://owasp.org/www-community/attacks/CSV_Injection

转换披露(9 条规则)

XLC-W01源文件里本来就带着 Excel 损坏

源 CSV 里有单元格符合已知的损坏特征(如 8.71E+12 这样的科学计数法、疑似丢掉的前导零)。转换只会把文件里实际有的内容存下来 —— 它变不回已经不存在的数位。无法恢复的单元格需要从原系统重新导出。

修复: 先把这一列过一遍 Excel 损坏诊断,看清哪些还救得回来,然后把受损的列从源系统重新导出。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-W02分隔符曾有歧义

这个文件有不止一种分隔符能解析出说得通的结果。转换用的是得分最高的那个候选;如果结果里的列看着错位了,那就是猜错了。

修复: 核对结果里的列数,或者用没有歧义的分隔符重新导出 CSV。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-R03公式按最后一次计算的值导出

工作簿里有公式。CSV 没有公式这个概念,所以每个公式单元格贡献的是表格上次为它算出来的那个值。如果工作簿保存前没有重算,这个缓存值可能是旧的。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-R04合并单元格已摊平

合并区域的值只保留在左上角那个单元格里,区域内其余单元格出来是空的。数据本来就是这么存的 —— 这里没有凭空造出任何东西来填空。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-R05日期单元格渲染成 ISO 文本

设了日期格式的单元格存的是天数序列号。它们按工作簿自己声明的纪元(1900,或者旧版 Mac 的 1904 —— 同一个序列号在两者间差 1462 天)渲染成了无歧义的 ISO 8601 文本。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-R06嵌入对象没有带过来

工作簿里存在图片、图表或嵌入文档。CSV 是纯文本;这里把它们数出来,是为了让「输出里没有它们」成为一件你知道的事,而不是一次无声的丢失。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-E07不是一个可读的 .xlsx 包

这个文件不是 xlsx 的 zip 容器。旧版 .xls 与设了密码的工作簿用的是另一种(OLE)容器,它们是「故意」不在支持范围内的 —— 猜着解析那些格式,只会产出「看起来很确定」的错数据。

修复: 用表格软件打开它,另存为(不加密的).xlsx,然后再转换。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

XLC-W08输出里含有 Excel 会再次弄坏的值

导出的 CSV 里有前导零或 12 位以上的值。在表格软件里双击打开,它们会被重新弄坏一遍 —— CSV 本身是对的,风险在于它接下来是怎么被打开的。

修复: 走表格软件的文本导入路径,把那些列设为「文本」—— 或者干脆把数据留在 .xlsx 里。

来源: https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7

XLC-E09输入是空的,或者不是表格

输入里没有可解析的行(空文件,或者没有任何候选分隔符能得出一致的列数)。什么都没有被转换。

来源: Own engineering rule. The conversion pipeline documents every liberty it takes; anything it cannot carry over is counted and disclosed rather than silently dropped.

范围要说实话:只处理数据表。公式按缓存值导出,样式不保留,数据透视表与图表带不过来,.xls(2007 年之前的二进制格式)不在范围内。同一套引擎驱动着 yaktool MCP 服务 里的 convert_csv_to_xlsxconvert_xlsx_to_csv 两个工具。

关于我们写出的 .xlsx,有一处需要说明:它的文件属性里记着 Application: yaktool.com,就像 Excel 会记「Microsoft Excel」、其他生成器也都会写上自己的名字一样。那只是元数据 —— 任何一个单元格都没有被动过,而 CSV 输出则完全不会被加进任何东西。

关于这些规则。 每一条都有编号、严重级别和通俗解释。每个来源链接都已登记在案,并对线上页面实际复验过,而不是凭印象写上去的. 规则如何编写、测试与保持更新 →