如何仅使用 .xla 文件中的代码从 Excel VBA 压缩文件 GZip?

How can I GZip compress a file from Excel VBA using code in an .xla file only?

提问人: 提问时间:10/4/2008 最后编辑:10 revs, 2 users 100%Matthew Murdoch 更新时间:5/7/2014 访问量:9802

问:

我需要能够在Excel VBA函数中GZip压缩文件。具体来说,我需要能够使用“放气”算法。

有没有办法在不执行命令行应用程序的情况下做到这一点?由于不依赖外部工具,代码将更加健壮。

理想情况下,代码将使用预安装的 VBA 或 COM 库函数 - 我不想自己实现此逻辑或安装 DLL 等。

如果可能的话,我希望函数的安装就像将 .xla 添加到可用的 Excel 加载项一样简单。无需 DLL、EXE、注册表项等。

编辑是否可以使用 .NET GZipStream 来执行此操作?

Excel GZIP 加载项 VBA

评论

0赞 Matthew Murdoch 10/4/2008
这需要在 Excel for Windows 中运行。我所说的“库”是指 VBA 可访问的函数或 COM 对象。

答:

0赞 JPLemme 10/4/2008 #1

如果要在 VBA 中实现算法,则需要(在 VBA 中)保存电子表格,然后使用 VB 的 I/O 函数打开文件、放气并再次保存。就所有意图和目的而言,它与编写处理文件的普通 VB 应用程序相同。您可能需要将 VBA 宏放在单独的工作簿中以避免“正在使用的文件”类型的错误,但是如果您以只读方式重新打开文件并使用不同的文件名保存它,则应该可以将所有内容保存在一个工作簿中。

但我几乎可以肯定,从 VBA 中掏出 gzip 在功能上是相同的,而且要容易得多。

编辑:一些代码。当我运行它时,它没有失败,因此可以将所有内容保留在同一个工作簿中。

Sub main()
    ActiveWorkbook.Save
    Open "macrotest.xls" For Binary Access Read As #1
    Open "newfile.zip" For Binary Access Write As #2
        'do your stuff here
    Close #2
    Close #1
End Sub
4赞 Joe Pineda 10/4/2008 #2

VBA(实际上是 VB6 的一种方言)对于此类应用程序来说很慢。我记得我曾经在 VB6 和 C 上实现了 Shannon-Fano 算法,C 版本的速度大约快了 10 倍,即使在将其转换为 DLLMain 并从那里调用而不是在命令行可执行文件上调用之后。

有许多 COM DLL 提供压缩服务,包括开源和共享软件,其中一些实现了 GZIP 的 deflate 算法。只需从您的 VBA 代码中从此类 DLL 中调用一个函数来代表您进行压缩,这非常简单。

我理解您不愿意使用应用程序外部的东西,尽管在这种情况下,为了性能,您可能不得不应用例外。

为了完全破坏您的乐趣,请检查windows\system32上的ZIPFLDR.DLL文件。您可能还想看看这些链接:

通过谷歌搜索找到两者,您应该能够找到更多/更好的示例。

评论

0赞 Matthew Murdoch 10/4/2008
是否没有提供此功能的内置(即由 Microsoft 作为 Windows 或 Excel 的一部分提供)COM 库?
0赞 Joe Pineda 10/4/2008
是的,Windows 附带了一个提供 ZIP 样式压缩的 COM 库。它包括 deflate 算法,尽管通过它生成的二进制文件的格式与 GZIP 的格式不同,因此即使它是相同的算法,您也不能使用它来解压缩文件。
0赞 Matthew Murdoch 10/5/2008
能否提供有关 Windows COM 库的详细信息。注意到不兼容,但它可能会满足我的要求。
0赞 Philippe Grondier 10/4/2008 #3

似乎你想打开一瓶葡萄酒,但你绝对拒绝使用开瓶器。只要没有允许文件的 GZipping 的 VBA 函数,如果没有一些外部资源(例如 dll 或 exe 文件),您将无法完成这项工作。

评论

0赞 Matthew Murdoch 10/4/2008
是否没有提供此功能的内置(即由 Microsoft 作为 Windows 或 Excel 的一部分提供)COM 库?
3赞 JPLemme 10/4/2008 #4

好的,我想我有一个答案给你。

zlib 是一个库,由编写您不想实现的 Deflate 算法的人编写。有一个 win32 DLL 可用。以下是有关在 Windows 使用它的常见问题解答:

http://www.zlib.net/DLL_FAQ.txt

查看问题 7。作者似乎不太热衷于 Windows 用户,似乎也不太热衷于 VB 用户,但只要他们足够友善地提供库,我们就可以完成剩下的工作。

如果这足以帮助您,那就太好了。如果您需要有关从 VBA 调用 C 库的帮助,请添加注释,我们会弄清楚的。我已经好几年没有做过任何 VB-to-C 调用了——这听起来很有趣。

0赞 JPLemme 10/4/2008 #5

如果有人想在不依赖第三方软件的情况下压缩文件,他们通常会将其实现为 COM 对象/DLL,因此它不仅可用于 Excel。如果有人想将 zip 功能合并到 Excel 中,他们将使用第三方工具,这样他们就不必重新实现算法。所以你是在逆流而上。然而。。。

http://www.cpearson.com/excel/SaveCopyAndZip.htm

有两个版本。COM 加载项版本“...允许您压缩已保存到磁盘的任何工作簿(但它可能处于未保存状态)。它依赖于 Moonlight Software 组件,但所有组件和设置都包含在安装程序中。它不完全是公共领域,但许可证的限制比 GPL 少。最终结果是一个 Excel 加载项(使用第三方组件)。

但是,如果你真的不想依赖外部工具,你要么自己实现压缩算法,要么等到Microsoft将该功能构建到Windows中并通过Excel公开它。

我希望这会有所帮助。