Excel 损坏诊断
把一列从表格软件里出来的数据粘进来。本工具会告诉你什么被改坏了 —— 以及更有用的那半句:是还能在这里修好,还是必须回源头重新导出。有些表格损坏是可逆的;有些直接毁掉数据,没有任何工具能把它换回来。
🔒 你的数据不会离开浏览器。
真正要紧的那个问题
多数工具会告诉你某个值看着不对。那是容易的一半。决定你这个下午怎么过的是另一半:原始数据是否还在文件里 —— 如果不在,花在修这份导出上的每一分钟都是白费,唯一的修法在上游。
拿 8.71E+12 来说。它看起来能修:展开一下就得到 8710000000000。但这个记法描述的是一个 13 位的数字,而它只带着其中 3 位。另外 10 位不在这个文件里。那次展开是一次装扮成修复的猜测 —— 如果它是条码,你刚刚凭空造出了一件商品。对照 8.712345678901E+12,它带着全部 13 位,确实能如实展开成 8712345678901。本工具会数清位数,告诉你落在哪一档。
为什么丢掉的前导零只能靠上下文看出来
表格软件会去掉前导零,好让值表现得像数字。单看 45678901234,没有任何迹象说明少了一个零 —— 它就是个十一位数。可把它放回一列里、而同列其余数字单元格都是十二位时,就一目了然了。所以本工具从整列推断应有的位数宽度(至少要有三个等长单元格,它才肯下这个结论),然后才给出还原值。
15 位的天花板
表格软件最多保留 15 位有效数字,第十五位之后一律变成零。十六位的标识符 —— 某些卡号、长序列号、某些内部 SKU —— 会静默地掉尾巴。一个以零结尾的长值正好就是这个形状,但真实数字也可能如此,所以这里报的是特征而不是判决。
会运行程序的那个单元格
以 =、+、- 或 @ 开头的单元格,在文件被打开时会被当作公式执行 —— 制表符、回车、换行,以及全角的 = + - @ 同样如此。这是安全问题而不是格式问题:它能把其他已打开表格的内容偷出去。它也是唯一一种通常还修得回来的损坏,因为文本其实一个字都没丢。
没法撤销的那一种
当 MAR1 这样的编码被读成日期,它就变成了 1-Mar,原文没了。这件事无法逆转,因为 MAR1、1MAR、MAR-1 都会得到同一个日期。本工具选择把候选列出来而不是替你挑一个 —— 那才是诚实的答案。最有名的案例是基因名,但任何「三个字母加数字」的 SKU 编法都躲不掉。
本工具执行的全部检查(11 条规则)
XL-S01科学计数法
一个长数字被转成了科学计数法。能不能修,取决于还剩几位有效数字:“8.71E+12” 描述的是一个十三位数,却只带着其中三位,另外十位已经没了,没有工具能把它们编出来。本工具会数清还剩多少位,并告诉你落在哪一档。
修复: 如果数位已经丢了,就从源头重新导出,并把该列设为文本格式 —— 修这一份拷贝是做不到的。
来源: Microsoft Support — Keeping leading zeros and large numbers
XL-S02第 15 位有效数字之后被舍入
表格最多保留 15 位有效数字,第十五位之后一律换成零。一个十六位及以上、且尾部全是零的值,正是这种损坏留下的形状 —— 但真实数字也可能恰好以零结尾,所以这里报的是「特征」,不是判决。
修复: 拿它和你的真相源核对。如果原值长于 15 位,尾部已经没了,这一列需要以文本格式重新导出。
来源: Microsoft Support — Keeping leading zeros and large numbers
XL-L01前导零被吃掉
表格会去掉前导零,好让值表现得像数字。这种损坏只能靠上下文发现:这个值恰好比同列其余值短一位 —— 而这正是丢了一个前导零的样子。
修复: 把该列设为文本格式重新导出。这里可以补回那个零,因为应有的位数从同列就能知道。
来源: Microsoft Support — Keeping leading zeros and large numbers
XL-D01编码被识别成了日期
一个长得像日期的商品编码被转成了日期。“MAR1” 变成 3 月 1 日,“SEPT2” 变成 9 月 2 日。现实里最有名的案例是基因名,但任何「三个字母加数字」的 SKU 编法都会中招。原文无法确定地还原,因为好几个编码会映射到同一个日期。
修复: 把该列设为文本格式重新导出。这里列出的候选是「可能性」,不是答案。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
XL-F01浮点尾巴
小数末尾一长串零或九,是二进制浮点运算留下的残渣 —— 0.1 + 0.2 会算出 0.30000000000000004 是出了名的。真正要的几乎总是四舍五入后的那个值,但原始字符串与它比不相等。
修复: 按这个字段实际需要的精度取整,金额通常是两位小数。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
XL-C01公式注入风险
以 =、+、-、@、制表符、回车或换行开头的单元格,在表格软件里打开时会被当作公式执行 —— 某些区域设置下,全角的 = + - @ 同样如此。这是安全问题,不是格式问题:它可以被用来窃取已打开表格的内容,或攻击打开这个文件的人。
修复: 在带引号的字段内部给单元格加一个制表符前缀,或者去掉开头那个字符。注意:基于引号的转义在表格软件重新保存文件时会被抹掉。
XL-E01表格错误值
#N/A 或 #REF! 这类错误值被当作纯文本导出了。上游某处的公式失败了,而失败本身被当成数据发了出来。
修复: 回源头修那个公式;这里没有任何值可以恢复。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
XL-T01显示格式被写进了值里
货币符号、千位分隔符、百分号,或者会计格式里表示负数的括号,都是「显示格式」,现在它们被写进数据本身了。Feed 与 API 要的是裸数字。
修复: 去掉这些格式。注意会计格式下括号表示负数 ——(1,234.00)是 -1234.00,不是 1234.00。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
XL-T02被强制转成了布尔值
某个值变成了 TRUE 或 FALSE。商品数据里真的该读作 “true” 的情况很少见;更常见的是一个编码、一个标记列,或者一个两字母的国家代码被当成了布尔值。
修复: 检查源列。如果原本是编码,以文本格式重新导出。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
XL-W01不可见空白或不换行空格
值里带着不换行空格、零宽字符,或首尾多余的空白。它们能扛过复制粘贴,会让精确匹配失败,而且在任何预览里都看不见。
修复: 去掉首尾空白,并把不换行空格换成普通空格。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
XL-N01未检出损坏
这个值上没有出现任何已知的表格损坏特征。
来源: 依据的是电子表格处理数字时有文档记载的行为,以及损坏在导出文件里留下的形状。每一种特征都用它自己的回归样例来匹配,而不是凭假设。
精度与前导零的行为依据 Microsoft Support — Keeping leading zeros and large numbers; 公式注入这一条依据 OWASP — CSV Injection. 其余的特征是从损坏在导出文件里留下的形状推出来的,每一条都有自己的回归用例在盯着。
关于这些规则。 每一条都有编号、严重级别和通俗解释。每个来源链接都已登记在案,并对线上页面实际复验过,而不是凭印象写上去的. 规则如何编写、测试与保持更新 →