Excel 转 Markdown:从电子表格网格到管道表
把 Excel 区域复制粘贴进 Markdown 看起来差不多能用——直到工作表里出现合并单元格、宽公式列或三个以上工作表。你得到的纯文本表格在记事本里可读,但一贴到 GitHub、Obsidian 或 wiki 上就坏了,因为转换器根本没理解它面前那张表的结构。
本文讲清 xlsx → Markdown 转换到底在做什么:怎么保留每一个工作表、怎么把合并区展开成真正的单元格、怎么保留 Excel 自身显示的日期和数字、最终产出在处处能渲染的 GFM 管道表。文中描述的一切都跑在你的浏览器里——不上传、不登录、服务器根本碰不到你的工作簿。
电子表格和表格不是一回事
xlsx 工作簿本质是一个 ZIP 里装着一堆 XML。里面有多个工作表,每个是一个矩形的单元格网格。单元格可以是空的、存字符串、存序列编号日期、存公式,也可以是带格式的值,比如 ¥1,240.50。一片单元格区域可以合并成一个可见单元格。整个结构还带布局、公式和显示元数据,这些是 Markdown 表格根本放不下的。
Markdown 管道表——GitHub、Obsidian 和大多数 wiki 都渲染的 GFM 形式——只有两行元数据,后面每行数据占一行,所有行必须列数相同。没有合并单元格,没有公式,没有布局。一个忠实的转换器要做的就是在这两个截然不同的世界之间翻译:把网格压平成行,让每个单元格装 Excel 屏幕上实际显示给你的那个值。
导出每一个工作表,而不是只导第一个
大多数小工具只导出当前活动的工作表,其余的就悄悄丢了。真正的转换应该遍历所有工作表、跳过完全空白的、每张输出成自己的 Markdown 表——工作表名作为上方的二级标题。这样你的工作簿落地就是一份 Markdown 文档,还保留着原来的结构。
本站默认是「全部工作表」,如果你只要一个,也可以在工作表选项里选「仅第一个」。完全空白或只有表头的表会自动过滤,不会生成一个空的 h2 标题却没有表格。
合并单元格:看不见的大麻烦
合并单元格是复制粘贴产出坏表的第一原因。Excel 把 A1:D1 合并成一个可见单元格时,底层网格其实还是四格——只有 A1 有值,B1 到 D1 都是空的。幼稚的复制粘贴或简单转换器会输出四列,其中三列空白,这会破坏行计数,产出任何 Markdown 解析器都渲染不了的表格。
解法叫展开:SheetJS 在我们构建表格之前就告诉我们工作簿里每一处合并范围。我们把每个合并区左上角的值复制到该区的所有其他单元格里,这样喂给 Pandoc 的网格就没有空位了。产出的管道表列数和 Excel 可见网格一致,每行都对齐,渲染干净。
日期、货币和数字:显示 Excel 显示的
Excel 把日期存成序列编号——46095 就是 2026 年 1 月 15 日。原始序列号在 Markdown 里毫无用处,而转换器如果自己套格式化规则又很容易错日期(这个单元格是 1/2 还是 2/1?)。唯一可信的来源是 Excel 自身显示的文本,SheetJS 用 raw:false 选项直接读这个。
货币、百分比、小数位、千分位分隔符——全都按你在公式栏看到的那个文本原样过来。1,240.50 还是 1,240.50,0.12 显示成 12% 就保留 12%,1/15/26 还是 1/15/26,不会被悄悄格式化成 2026-01-15。
公式 vs 值
Excel 单元格可以存公式(=SUM(A1:A10))也可以存它算出来的值(1240.50)。Markdown 表格只能存值。有些转换器尝试保留公式语法,但这在 Excel 之外几乎没用。我们读的是计算后的值——Excel 运行公式后会显示给你的那个数字或文本。如果你要公式本身,先把工作簿导出成 CSV;这个转换器要的是可读的结果,不是计算过程。
宽表怎么处理
有十五列的工作表转起来没问题——Pandoc 会输出完全有效的管道表。好不好看取决于你在哪看。大多数 Markdown 渲染器会自然换行或横向滚动,Obsidian、GitHub、Hugo 都能处理。如果目标平台不行,就在转换前把工作簿拆成几个窄点的表,或者接受宽表就是表里实际的样子,让渲染器自己横向滚动。
我们不会悄悄丢列或折叠数据。出来的表就是工作簿里那份网格——没有惊喜,没有丢失。
为什么要两个引擎:SheetJS 读,Pandoc 格式化
本站用 SheetJS Community Edition 解析工作簿,再把产出的 HTML 表格交给 Pandoc 来输出 Markdown(GFM)。SheetJS 搞定 Excel 的那些麻烦细节——合并范围、日期序列、显示格式、ZIP 包本身。Pandoc 搞定 Markdown 方言的麻烦细节——管道表语法、对齐提示、最终 CommonMark 合规。
两个都跑在浏览器里意味着什么都不会碰服务器。SheetJS 库只在你真的丢 xlsx 文件进来时才下载一次,Pandoc 在你第一次使用转换器时就已经常驻标签页了。一个典型多工作表的工作簿端到端不到十秒。