繁体   English   中英

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

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

我需要能够在Excel VBA函数中压缩文件。 具体来说,我需要能够使用'deflate'算法。

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

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

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

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

对于这类应用程序,VBA(实际上是VB6的方言)很慢。 我记得我曾经在VB6和C上实现了Shannon-Fano算法,即使在转换成DLLMain并从那里调用而不是在命令行可执行文件中,C版本也快了大约10倍。

有许多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电话 - 听起来很有趣。

如果要在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

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

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

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

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

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

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM