什么时候应该使用 xlsm 或 xlsb 格式?

Posted

技术标签:

【中文标题】什么时候应该使用 xlsm 或 xlsb 格式?【英文标题】:When should the xlsm or xlsb formats be used? 【发布时间】:2011-10-19 12:55:12 【问题描述】:

自 Excel 2007 起,Microsoft 已将经典的 .xls 格式拆分为多种格式(特别是 .xlsx.xlsm.xlsb)。我理解.xlsx 格式的用途和目的没有问题,但我仍然想知道在创建包含一些VBA 的文件时是否应该使用.xlsm.xlsb 格式。

当然,你可以在网上找到一些主题,例如:

在Microsoft answers forum 在上一个链接中指向的 Microsoft blog 上(但我已经解析到第 10th 页,但没有找到对 .xlsb 的引用) this topic from another forum

我从最后一个链接了解到.xlsm 是某种 XML 格式,因此是自定义功能区选项卡所必需的。

除了conceptual格式的区别(.xlsm是基于XML VS .xlsb是一个二进制文件),是使用此文件时(除了功能区自定义)有任何实际区别吗? 在使用这些格式时,您有没有发现真正的区别?

【问题讨论】:

xlsb 通常小于 xlsm 这里有一些有用的信息 - analystcave.com/… 出于某种原因,使用 .xlsb 而不是 .xlsm 解决了我们在对象模型中使用用户定义函数创建幻像对象时遇到的一些问题:superuser.com/questions/1005482/… 【参考方案1】:

.xlsx 加载时间比.xlsb 长 4 倍,保存时间长 2 倍,文件大 1.5 倍。我在生成的工作表上对此进行了测试,该工作表包含 10'000 行 * 1'000 列 = 10'000'000 (10^7) 个简单链式 =…+1 公式的单元格:

╭──────────────╥────────┬────────╮
│              ║ .xlsx  │ .xlsb  │
╞══════════════╬════════╪════════╡
│ loading time ║ 165s   │  43s   │
├──────────────╫────────┼────────┤
│ saving time  ║ 115s   │  61s   │
├──────────────╫────────┼────────┤
│ file size    ║  91 MB │  65 MB │
╰──────────────╨────────┴────────╯

(硬件:Core2Duo 2.3 GHz,4 GB RAM,5.400 rpm SATA II HD;Windows 7,在其他进程的负载下。)

除此之外,应该没有区别。更准确地说,

两种格式支持完全相同的功能集

从 2006 年 8 月 29 日引用此博客 post。所以也许.xlsb 不支持功能区代码的信息比上面的引用更新,但我认为你的论坛来源是错误的。破解打开二进制文件时,似乎是1对1简洁地模仿OOXML文件结构:Blog article from 2006-08-07

【讨论】:

只有一次试验,但没有 ministat(1) 结果:-\ 我确认我的一个带有自定义功能区的文件在 xlsb 中运行良好。 @PatrickLepelletier .xlsx 类似于 .xlsm,只是禁用了宏。两者都是基于 XML 的。与此相反,.xlsb 是二进制的。因此,您应该将问题解读为“.xlsx / .xlsm 与 .xlsb”。 (没有宏禁用版本的二进制.xlsb。) 如果xlsb更好,为什么xlsx是默认的? xlsb一定有什么缺点吧? @PProteus,简单地说xlsb在特定领域比较好。引入 XML 标准的整个想法是更加透明,使文件更便携,文件操作更容易。现在第三方工具可以正确读取/写入 Excel 文件(我知道,他们可以通过一些逆向工程来做到这一点,但这很容易出错)。另一方面,使用大型 Excel 文件确实不是 Excel 的主要用途,因此更便携的权衡很少。此外,使用非宏文件在一定程度上增加了安全性。作为比较,如果 Assembler 更好,为什么还要使用 Java?【参考方案2】:

它们的相似之处在于它们本质上是包含实际文件组件的 zip 文件。您只需将扩展名替换为 .zip 并打开即可查看内容。与 xlsb 的区别似乎在于组件不是基于 XML 的,而是二进制格式:据说这在处理大文件时很有用。

https://blogs.msdn.microsoft.com/dmahugh/2006/08/22/new-binary-file-format-for-spreadsheets/

【讨论】:

.xls 文件是二进制格式。 .xlsb 文件为较新的 office 版本保留此二进制格式。以二进制格式存储数据既有大小差异,又有速度优势,但只有在非常大的文件中才会注意到这些改进。【参考方案3】:

人们可能认为 xlsb 仅比 xlsm 有优势。 xlsm 是基于 XML 并且 xlsb 是二进制的事实是,当工作簿发生损坏时,修复 xlsm 比修复 xlsb 的机会更大。

【讨论】:

如果这是真的,那么 xlsm 就是适合我的。自 90 年代中后期以来,我一直受到损坏的 Excel 文件的诅咒。这几乎足以让我以挖沟为生。 Office 2000 是第一个具有文件恢复功能的版本。但我没有 XLSX 和 XLSM 文件扩展名比 2007 年之前的 Excel XLS 文件扩展名稳定得多。 为什么要投赞成票?有这方面的任何实际证据吗? “神话:二进制工作簿更容易损坏文件”spreadsheet1.com/how-to-save-as-binary-excel-workbook.html【参考方案4】:

仅供后人参考,以下是来自多个外部来源的有关 Excel 文件格式的文本。其中一些已在此问题的其他答案中提及,但未复制基本内容。

1.来自Doug Mahugh, August 22, 2006

...新的 XLSB 二进制格式。与 Open XML 一样,它是一个 全保真文件格式,可以存储您可以创建的任何内容 Excel,但 XLSB 格式针对性能进行了优化 纯 XML 格式是不可能的。

XLSB 格式(有时也称为 BIFF12,如“二进制 Office 12”的文件格式)使用相同的开放打包约定 由 Open XML 格式和 XPS 使用。所以它基本上是一个 ZIP 容器,您可以使用任何 ZIP 工具打开它以查看里面的内容。 但是,您会在包中找到 .BIN 部分,而不是 .XML 部分...

本文也参考documentation about the BIN format,篇幅太长,此处无法复制。

2。来自MSDN Archive, August 29, 2006,后者又引用了一篇关于 XLSB 格式的已经缺失的博客文章:

尽管我们已经做了很多工作来确保我们的 XML 格式 快速高效打开,这种二进制格式还是比较多的 高效的 Excel 打开和保存,并且可以带来一些性能 包含大量数据的工作簿的改进,或者 在打开过程中需要大量的 XML 解析。 (事实上​​,我们已经 发现新的二进制格式比旧的 XLS 格式更快 很多情况。)此外,这种文件格式没有无宏版本 – 所有 XLSB 文件都可以包含宏(VBA 和 XLM)。在所有其他 方面,它在功能上等同于上面的 XML 文件格式:

文件大小 – 两种格式的文件大小大致相同,因为 两种格式都使用 zip 压缩架构保存到磁盘 - 两种格式都使用相同的包装结构,并且都具有相同的 部分级结构。功能支持——两种格式都完全支持 相同的功能集运行时性能——一旦加载到内存中, 文件格式对应用程序/计算速度没有影响 转换器——两种格式都支持相同的转换器

【讨论】:

"两种格式的文件大小大致相同" -- 这必须是过时的信息。 xlsb 的较小尺寸是常识。我刚刚将一个 25 MB xlsx 文件(包含由四个字段组成的一百万条记录,没有宏)保存为 xlsm 和 xlsb。 xlsm 副本也是 25 MB。 xlsb 副本为 9.6 MB。 @johnywhy 为什么可能在 15 年内有所改进......或者它也可能对数据敏感? 我怀疑“类似大小”是基于在相对较少的单元格中包含大量内容、公式等的工作表,因此由于 xml 开始和结束标记,开销有限。也许当您有很多单元格中的数据很少时,就像@johny 为什么那样,xml 开始和结束标签会造成更大的损失?【参考方案5】:

XLSB 格式也专用于嵌入在位于 excel 启动文件夹 (XLSTART) 中的隐藏工作簿文件中的宏。

在 XLSTART 文件夹中使用 xlsm 或 xlsb 进行快速而肮脏的测试:

Measure-Command  $x = New-Object -com Excel.Application ;$x.Visible = $True ; $x.Quit() 

xlsb(二进制)的 0,89s 与 xlsm 格式(zip 文件中的 xml)相同内容的 1,3s ... :)

【讨论】:

以上是关于什么时候应该使用 xlsm 或 xlsb 格式?的主要内容,如果未能解决你的问题,请参考以下文章

excel无法打开文件因文件格式或文件扩展名无效

xlsm的文件怎么打开?

打开 Excel VBA 2016 .xlsm 文件

使用 pandas 和 pyxlsb 以 xlsb 文件格式(Excel 二进制文件格式)写入输出

将 xlsb 文件读取为 pandas 数据框并将日期列解析为日期时间格式

NodeJs实现下载Excel文件