跳到主要内容
Convertube

Excel 文件:工作簿是一个装满 XML 的 ZIP,而 PDF 里根本没有表格

XLSX 里到底装了什么、为什么从 PDF 里取表格是推断而不是提取、以及哪些单元格会变成数字。在浏览器里转换,文件不上传。

速览

类型
文档
扩展名
.xlsx
MIME 类型
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
别称
XLSX, Microsoft Excel, spreadsheet

一个 .xlsx 文件是一个装着 XML 的 ZIP 归档,构造和 Word 那页讲的 .docx 完全相同,同属 2007 年那次 Office Open XML 的迁移。把它改名成 .zip 打开,你会看到一个列出各个工作表的 workbook 部件、每个工作表各自存放单元格的部件、一个样式部件,以及把它们连起来的关系文件。正因为它是「ZIP 里的 XML」,一个工作簿可以在完全不涉及微软代码的情况下写出来——本站就是这么做的:直接产出五个 XML 部件,而不是往打包体积里加一个电子表格库。单元格文字以内联字符串写入,所以每个工作表都是自洽的;上限用的是 Excel 自己的:1048576 行、16384 列、255 个工作表。

展开说明

难的部分完全在另一侧。PDF 里没有表格。它有的是一串串各自带位置的字形,而你看见的那些框线是与之无关的绘图指令——文件里没有任何地方记录着「这里有一个单元格」,更不用说哪些文字属于它。所以这个网格只能从几何关系里推断出来,而这也正是所有做这件事的工具实际在做的事,包括那些收费的。

推断分两步。行来自共享的基线,这是可靠的那一半,因为页面本来就是这么排出来的。列来自横向范围的重叠,而且一条带必须在若干行上反复出现才算一列——「反复出现」正是真正的列和一个恰好缩进了的段落之间的区别。只看左边缘是不行的,这一点值得记下来,因为它是最容易想到的第一版实现,而它恰恰在最普通的表格上失败:一个右对齐的数量列里装着 6、96 和 240,左边缘有三个不同的位置,彼此差一个数字宽,于是这一列会被拆开,每一行还多出一个空单元格。用重叠判断,则不需要知道它是左对齐、右对齐还是居中。

什么样的内容会被当成数字写进去,是刻意保守的:只有普通的、可带符号的小数,别的都不算。007、1,234、2026-09-10、+44 20,以及任何带货币符号的,都原样保留,因为前导零、千位分隔符和日期各自都是信息,强行转换会把它毁掉。小数位会保留,所以 48.50 到达时仍是 48.50 而不是 48.5。做不到的事写在页面上而不是藏起来:合并单元格会落在它跨越的第一列里,一个文字折成两行的单元格会变成两行,每页产出一个工作表;而一个没有重复列结构的页面会以单独一列的文本行返回——对散文来说,这就是诚实的答案。

把其他格式转成 Excel

Excel常见问题

XLSX 真的是个 ZIP 文件吗?

是的,和 DOCX 一模一样。改名成 .zip 打开就行:里面是描述工作簿、各个工作表、样式,以及它们之间关系的 XML 部件。

导出来的数字真的能求和吗?

能,前提是那个单元格是普通小数——这类值是以数字写入的,所以 SUM 之类的函数对它们有效。任何有歧义的内容会被刻意保留为文本,而文本不参与求和。

为什么我的编号 007 变成了文本?

因为那个前导零本身是信息。存成数字会让它变成 7,而且再也找不回来,所以「只是看起来像数字」的值会原样保留。

我的表格丢了列的分界,为什么?

列是靠单元格横向范围的重叠、并且在页面上反复出现来识别的。只有一两行的表格,或者单元格位置不规整的表格,给不了推断可以咬住的东西,就会以文本行的形式返回。

扫描版 PDF 能用吗?

不能,而且它会直接拒绝而不是硬猜。文字识别返回的是每个检测框一行文本,这足以重建散文,不足以重建一张网格——检测框合并相邻单元格的情况足够多,多到结果会「看起来像个表格」但其实是错的。

这里能把 Excel 转成 PDF 吗?

本地不行。要把工作簿按 Excel 的方式渲染出来——分页符、打印区域、列宽——需要 Excel 或 LibreOffice,而它们都无法在浏览器标签页里运行。本站的转换是「进入 XLSX」而不是「从 XLSX 出来」。