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

有没有一种方法可以在不必执行命令行应用程序的情况下执行此操作?由于不依赖外部工具,代码将更加健壮。

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

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

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

有帮助吗?

解决方案

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

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

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

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

通过谷歌搜索找到了这两个例子,你应该能够找到更多/更好的例子。

其他提示

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

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

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

查看问题7.作者对Windows用户似乎并不热衷,并且似乎对VB用户一点都不热衷,但只要他们足够友好提供库,我们就可以完成其余的工作。

如果这足以帮助你,那就太好了。如果您需要帮助从VBA调用C库添加注释,我们将解决它。多年来我没有做过任何VB-to-C电话 - 听起来很有趣。

似乎你想打开一瓶葡萄酒,但你肯定会拒绝使用开瓶器。只要没有允许GZipping文件的VBA功能,没有一些外部资源(如dll或exe文件)就无法完成工作。

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

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

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

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

我希望这会有所帮助。

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

但是我几乎可以肯定,从VBA内部对gzip进行shell操作将在功能上完全相同且无限容易。

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

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top