excel - online - macro para abrir archivos comprimidos
¿Cómo puedo comprimir GZip un archivo de Excel VBA utilizando código en un archivo.xla solamente? (5)
Necesito poder comprimir un archivo GZip en una función de Excel VBA. Específicamente, necesito poder usar el algoritmo ''desinflar''.
¿Hay alguna forma de hacerlo sin tener que ejecutar una aplicación de línea de comandos? Sin dependencia de las 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 ni 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, EXEs, entradas de registro, etc.
Editar ¿Puedo hacer uso de .NET GZipStream para hacer esto?
De acuerdo, 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 el uso de Windows:
http://www.zlib.net/DLL_FAQ.txt
Echa un vistazo a la pregunta 7. Los autores no parecen demasiado interesados en los usuarios de Windows y no parecen muy interesados en los usuarios de VB, pero siempre que sean lo suficientemente amables como para proporcionar la biblioteca, podemos hacer el resto.
Si esto es suficiente para ayudarte, entonces genial. Si necesita ayuda para llamar a la biblioteca C de VBA, agregue un comentario y lo solucionaremos. No he hecho ninguna llamada VB-to-C en años, suena divertido.
Parece que quiere abrir una botella de vino, pero definitivamente se niega a usar un abrebotellas. Siempre que no haya una función VBA que permita el GZipping de un archivo, no podrá realizar el trabajo sin algún recurso externo como un archivo dll o exe.
Si desea implementar el algoritmo en VBA, deberá (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 ordinaria de VB que funcione en un archivo. Es posible que deba colocar la macro de VBA en un libro de trabajo separado para evitar los tipos de errores "de archivo en uso", pero si vuelve a abrir el archivo como de solo lectura y lo guarda con un nombre de archivo diferente, debería mantener todo en un solo libro de trabajo.
Pero estoy casi seguro de que bombardear con gzip dentro del 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
Si alguien quisiera comprimir archivos sin confiar en software de terceros, generalmente lo implementaría como un objeto COM / DLL para que esté disponible para algo más que Excel. Si alguien quisiera incorporar la funcionalidad zip en Excel, usaría herramientas de terceros para no tener 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 de complemento COM "... le permite comprimir cualquier libro que se haya guardado en el disco (pero puede estar en un estado no guardado)." Se basa en un componente de Moonlight Software, pero todos los componentes y la configuración están contenidos en el instalador. No es un dominio público, pero la licencia es menos restrictiva que la GPL. El resultado final es un complemento de Excel (que usa un componente de terceros).
Pero si realmente no quieres depender de herramientas externas, tendrás que implementar el algoritmo de compresión tú mismo o esperar a que Microsoft cree esa funcionalidad en Windows y la exponga a través de Excel.
Espero que esto ayude.
VBA (que es realmente 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 era aproximadamente 10 veces más rápida, incluso después de ser convertida en una DLLMain y llamada desde allí en lugar de en un ejecutable de línea de comandos.
Hay muchas DLL COM que proporcionan servicios de compresión, tanto de código abierto como de shareware, y algunas de ellas implementan el algoritmo de deflación de GZIP. Sería realmente simple llamar a una función de dicha DLL desde su código VBA para hacer la compresión en su nombre.
Entiendo que usted sea reacio a usar algo externo a su aplicación, aunque en este caso podría tener que aplicar una excepción por el rendimiento.
En un esfuerzo por arruinar por completo su diversión, examine el archivo ZIPFLDR.DLL en windows / system32. También te puede interesar ver estos enlaces:
- Esto tiene un ejemplo de cómo hacer lo que quiere (comprimir con las capacidades de Windows incorporadas de ZIP) de VB.NET, no debe ser muy diferente de VBA o VB6: ZIP transparente con llamada a DLL
- Este tiene una aplicación de muestra en VB6 usando las capacidades integradas de Windows para comprimir (en ZIP en lugar de formato GZIP, por supuesto): Usar la extensión de shell "Compressed Folder" de Windows XP para trabajar con archivos .zip
Encontrado a través de Google, debería poder encontrar más / mejores ejemplos.