教程 · Excel → Markdown

Excel 转 Markdown:公式和格式

Markdown 表格是一个文字的矩形。工作表是一个格子的矩形,而一个格子底下能压着公式,上面能盖着显示格式,还能被合并拉到隔壁去。这四样里有三样无处安放。

于是真正该问的是一个很窄的问题:这张表知道的一切里,有多少能到表格里,而你要的那部分在不在里面。

去转换器

公式变成它的答案

=SUM(B2:B9) 出来是 4211。这个方向才有用,因为 Markdown 什么都不算 —— 粘过去的公式只会在文档里当几个不动的字符待着,看着像有意思,其实没有。

它能这么做,是因为 Excel 每次保存文件时都会把算好的值缓存在公式旁边。转换器读的是这个缓存值,所以它不需要自带一个公式引擎,整件事也才能在一个浏览器标签页里跑。

Excel 里的格子
B10:  =SUM(B2:B9)
Markdown
| Total | 4211 |

没人打开过的那些工作簿

如果这个工作簿是脚本生成的 —— Python 导出、报表任务、任何用表格库写出来的东西 —— 而且从来没在 Excel 里打开过,那就没有缓存值。没人写过。这些格子转出来是空的。

一趟往返就能解决:用 Excel 或者 LibreOffice 打开这个工作簿,保存,关掉。填缓存的动作就是保存。而读出来仍然是空的工作表会在输出上方被点名,所以你不会顺手复制走一张全是空格的表。

公式错误也是转成空,而不是 #DIV/0! 或者 #REF!。一整列查找出错会变成一列空白 —— 所以某一列莫名其妙是空的,回去查源文件。

数字格式留不下来

这一页里,这条最该在转换之前先看。Excel 把显示遮罩和存下来的数字放在两个地方,只有后者是数据 —— 遮罩是一条渲染指令。

所以 $1,234.50 落地成 1234.5,显示 12.50% 的格子落地成 0.125。没有谁被弄坏:这些就是文件里一直存着的数,只是没戴那层遮罩。

格式要紧的话,在表格里加一列用 TEXT() 公式拼出格式化后的字符串,然后用那一列。那样它就是文字了,而文字会一字不差地转过来。

日期是例外。它们也是按数字存的,但数字格式能认出它们,所以出来是 1995-01-01,有时间的话后面跟上时间。它们是刻意按 UTC 读回来的 —— 图省事的写法会让格林尼治以西的每个人的日期都往前挪一天。

合并单元格会拆开

一个跨 A1:C1 合并的标题出来是一个装着文字的格子,旁边两个空格子。Excel 把值留在合并区域左上那一格,其余的确实是空的,所以能读到的就是这些。

Markdown 没有 colspan,所以没有办法把它拼回去。版式要紧的话先在 Excel 里拆掉 —— 很多时候那些合并只是为了把标题居中。

颜色、字体、边框、条件格式、单元格批注也一样留不下,理由相同:Markdown 里没有它们的语法。

工作表:一张,或者几张

只有选了不止一张表的时候才会有那个标题。只有一张的时候你已经知道是哪张了,标题只是噪音。

末尾的空行会先裁掉,这件事比听起来重要:在 Excel 里空白处点几下,能让一张工作表声称自己有几百行、而里面什么都没有。裁完是空的工作表会明说,而不是给你一张全是空白的表格。

  1. 01把工作簿拖进来。工作表名会带着行数列出来,第一张会被转换。
  2. 02勾上你要的工作表。改选区是拿内存里已经读好的那份重新渲染 —— 文件不会再读一次。
  3. 03选了几张就出成一份文档,每张表在一个带工作表名的 ## 标题下面。

大小上限,和被拒掉的文件

每个工作簿 10 MB —— 比别的格式那个 25 MB 低。.xlsx 是个 zip,在标签页里解开它花的内存比文件大小看着要多得多。

选中的全部内容一共十万格,所以少选几张表能让一个大工作簿过关,而整个一起就过不了。

带密码的工作簿会被拒掉,而不是读一半。老的二进制 .xls 也一样 —— 这两种都是 OLE 容器而不是 zip,这里都读不了。用 Excel 打开,不设密码另存成 .xlsx。

不小心把 .docx 或者 PDF 拖到这一页上,它不会硬试:文件头会先查一遍,提示里会写出接这种文件的是哪一页。

把工作簿拖进来,勾上要的工作表,复制表格。.xlsx 是在这个标签页里解开的,不去别处 —— 文件是财务模型的时候,这一点要紧。

Excel → MD