¿Cómo puedo GZip comprimir un archivo de Excel VBA usando el código en un archivo .xla solamente?

StackOverflow https://stackoverflow.com/questions/167888

Pregunta

Necesito poder comprimir un archivo GZip en una función de Excel VBA. Específicamente, necesito poder usar el algoritmo de "desinflado".

¿Hay alguna manera de hacer esto sin tener que ejecutar una aplicación de línea de comando? Sin dependencia de herramientas externas, el código será más robusto.

Lo ideal sería que el código hiciera uso de las funciones de biblioteca VBA o COM preinstaladas. No quiero tener que implementar esta lógica por mi cuenta o instalar DLL, etc.

Si es posible, quiero que la instalación de la función sea tan simple como agregar un .xla a los complementos de Excel disponibles. No se requieren archivos DLL, EXE, entradas de registro, etc.

Editar ¿Puedo usar .NET GZipStream para hacer esto?

¿Fue útil?

Solución

VBA (que en realidad es un dialecto de VB6) es lento para este tipo de aplicaciones. Recuerdo que una vez implementé el algoritmo Shannon-Fano en VB6 y en C, la versión C fue aproximadamente 10 veces más rápida, incluso después de ser convertida en un DLLMain y llamada desde allí en lugar de en un ejecutable de línea de comandos.

Hay muchos DLL COM que proporcionan servicios de compresión, tanto de código abierto como shareware, y algunos de ellos implementan el algoritmo de desinflado de GZIP. Sería realmente sencillo llamar a una función de una DLL de ese tipo desde su código VBA para hacer la compresión en su nombre.

Comprendo que te muestres reacio a usar algo externo a tu aplicación, aunque en este caso es posible que tengas que aplicar una excepción por el bien del rendimiento.

En un esfuerzo por estropear completamente su diversión, examine el archivo ZIPFLDR.DLL en windows \ system32. También te puede interesar echar un vistazo a estos enlaces:

Encontró ambos a través de googlear, debería poder encontrar más / mejores ejemplos.

Otros consejos

OK, creo que tengo una respuesta para ti.

zlib es una biblioteca escrita por el tipo que escribió el algoritmo de desinflado que no desea implementar. Hay una DLL win32 disponible. Aquí están las preguntas frecuentes sobre cómo usarlo desde Windows:

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

Consulte la pregunta 7. Los autores no parecen demasiado interesados ??en los usuarios de Windows, y no parecen estar interesados ??en absoluto en los usuarios de VB, pero mientras tengan la amabilidad de proporcionar la biblioteca, podemos hacer el resto .

Si esto es suficiente para ayudarte, entonces genial. Si desea ayuda para llamar a la biblioteca C desde VBA, agregue un comentario y lo resolveremos. No he hecho ninguna llamada de VB a C en años, suena divertido.

Parece que quieres abrir una botella de vino pero definitivamente te niegas a usar un abrebotellas. Mientras no haya una función VBA que permita el archivo GZipping de un archivo, no podrá hacer el trabajo sin algún recurso externo como un archivo dll o exe.

Si alguien quisiera comprimir archivos sin depender del software de terceros, generalmente lo implementaría como un objeto COM / DLL, por lo que estaría disponible para algo más que Excel. Si alguien quisiera incorporar la funcionalidad zip en Excel, utilizaría herramientas de terceros para que no tuvieran que volver a implementar el algoritmo. Entonces estás nadando contra la corriente. Sin embargo ...

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

Hay dos versiones. La versión del complemento COM " ... te permite comprimir cualquier libro que se haya guardado en el disco (pero puede estar en un estado sin guardar). & Quot; Se basa en un componente del software Moonlight, pero todos los componentes y la configuración están contenidos en el instalador. No es un dominio bastante público, pero la licencia es menos restrictiva que la GPL. El resultado final es un complemento de Excel (que utiliza un componente de terceros).

Pero si realmente no quieres ninguna dependencia de herramientas externas, tendrás que implementar el algoritmo de compresión por ti mismo o esperar hasta que Microsoft compile esa funcionalidad en Windows y la exponga a través de Excel.

Espero que esto ayude.

Si desea implementar el algoritmo en VBA, necesitaría (en VBA) guardar la hoja de cálculo y luego usar las funciones de E / S de VB para abrir el archivo, desinflarlo y guardarlo nuevamente. Para todos los efectos, es idéntico a escribir una aplicación de VB normal que funcione en un archivo. Es posible que deba colocar la macro VBA en un libro de trabajo separado para evitar el uso del archivo " tipos de errores, pero si vuelve a abrir el archivo como de solo lectura y lo guarda con un nombre de archivo diferente, debería estar bien manteniendo todo en un libro de trabajo.

Pero estoy casi seguro de que el desplazamiento hacia gzip desde el VBA sería funcionalmente idéntico e infinitamente más fácil.

EDITAR: Algunos códigos. No falló cuando lo ejecuté, así que está bien mantener todo en el mismo libro de trabajo.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top