提问人: 提问时间:10/4/2008 最后编辑:10 revs, 2 users 100%Matthew Murdoch 更新时间:5/7/2014 访问量:9802
如何仅使用 .xla 文件中的代码从 Excel VBA 压缩文件 GZip?
How can I GZip compress a file from Excel VBA using code in an .xla file only?
问:
我需要能够在Excel VBA函数中GZip压缩文件。具体来说,我需要能够使用“放气”算法。
有没有办法在不执行命令行应用程序的情况下做到这一点?由于不依赖外部工具,代码将更加健壮。
理想情况下,代码将使用预安装的 VBA 或 COM 库函数 - 我不想自己实现此逻辑或安装 DLL 等。
如果可能的话,我希望函数的安装就像将 .xla 添加到可用的 Excel 加载项一样简单。无需 DLL、EXE、注册表项等。
编辑是否可以使用 .NET GZipStream 来执行此操作?
答:
如果要在 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
VBA(实际上是 VB6 的一种方言)对于此类应用程序来说很慢。我记得我曾经在 VB6 和 C 上实现了 Shannon-Fano 算法,C 版本的速度大约快了 10 倍,即使在将其转换为 DLLMain 并从那里调用而不是在命令行可执行文件上调用之后。
有许多 COM DLL 提供压缩服务,包括开源和共享软件,其中一些实现了 GZIP 的 deflate 算法。只需从您的 VBA 代码中从此类 DLL 中调用一个函数来代表您进行压缩,这非常简单。
我理解您不愿意使用应用程序外部的东西,尽管在这种情况下,为了性能,您可能不得不应用例外。
为了完全破坏您的乐趣,请检查windows\system32上的ZIPFLDR.DLL文件。您可能还想看看这些链接:
- 这有一个示例,说明如何从 VB.NET 做你想做的事(使用Windows内置ZIP功能压缩),它应该与VBA或VB6没有太大区别:带有DLL调用的透明ZIP
- 这个在VB6上有一个示例应用程序,使用Windows内置功能进行zip(当然是ZIP而不是GZIP格式):使用Windows XP“压缩文件夹”shell扩展来处理.zip文件
通过谷歌搜索找到两者,您应该能够找到更多/更好的示例。
评论
似乎你想打开一瓶葡萄酒,但你绝对拒绝使用开瓶器。只要没有允许文件的 GZipping 的 VBA 函数,如果没有一些外部资源(例如 dll 或 exe 文件),您将无法完成这项工作。
评论
好的,我想我有一个答案给你。
zlib 是一个库,由编写您不想实现的 Deflate 算法的人编写。有一个 win32 DLL 可用。以下是有关在 Windows 使用它的常见问题解答:
http://www.zlib.net/DLL_FAQ.txt
查看问题 7。作者似乎不太热衷于 Windows 用户,似乎也不太热衷于 VB 用户,但只要他们足够友善地提供库,我们就可以完成剩下的工作。
如果这足以帮助您,那就太好了。如果您需要有关从 VBA 调用 C 库的帮助,请添加注释,我们会弄清楚的。我已经好几年没有做过任何 VB-to-C 调用了——这听起来很有趣。
如果有人想在不依赖第三方软件的情况下压缩文件,他们通常会将其实现为 COM 对象/DLL,因此它不仅可用于 Excel。如果有人想将 zip 功能合并到 Excel 中,他们将使用第三方工具,这样他们就不必重新实现算法。所以你是在逆流而上。然而。。。
http://www.cpearson.com/excel/SaveCopyAndZip.htm
有两个版本。COM 加载项版本“...允许您压缩已保存到磁盘的任何工作簿(但它可能处于未保存状态)。它依赖于 Moonlight Software 组件,但所有组件和设置都包含在安装程序中。它不完全是公共领域,但许可证的限制比 GPL 少。最终结果是一个 Excel 加载项(使用第三方组件)。
但是,如果你真的不想依赖外部工具,你要么自己实现压缩算法,要么等到Microsoft将该功能构建到Windows中并通过Excel公开它。
我希望这会有所帮助。
评论