Como posso GZip compactar um arquivo do Excel VBA usando o código em apenas um arquivo .xla?

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

Pergunta

Eu preciso ser capaz de GZip compactar um arquivo em uma função do Excel VBA. Especificamente eu preciso ser capaz de usar o 'desinflar' algoritmo.

Existe uma maneira de fazer isso sem ter que exec um aplicativo de linha de comando? Sem dependência de ferramentas externas o código será mais robusto.

Idealmente, o código seria fazer uso de VBA pré-instalado ou COM funções de biblioteca -. Eu não quero ter que implementar essa lógica me ou instalar DLLs etc

Se possível, quero instalação da função a ser tão simples como a adição de um .xla ao disponíveis Excel Add-Ins. Nenhum DLLs, EXEs, entradas de registro etc. necessário.

Editar Posso fazer uso do .NET GZipStream fazer isso?

Foi útil?

Solução

VBA (que é realmente um dialeto do VB6) é lento para este tipo de aplicações. Eu me lembro que uma vez implementado algoritmo de Shannon-Fano em VB6 e em C, a versão C foi cerca de 10 vezes mais rápido, mesmo depois de ser transformado em um DLLMain e chamou de lá, em vez de em um executável de linha de comando.

Existem muitos COM DLLs que fornecem serviços de compressão, tanto open source e shareware, e alguns deles implementar algoritmo deflate de GZIP. Seria muito simples apenas para chamar uma função de tal DLL do seu código VBA para fazer a compressão em seu nome.

Eu entendo seu ser relutantes em usar algo externo a sua aplicação, embora, neste caso, você pode ter que aplicar uma exceção por causa do desempenho.

Em um esforço para completamente estragar sua diversão, examine Zipfldr.dll arquivo no Windows \ System32. Você também pode gostar de dar uma olhada nestes links:

Encontrado tanto através de googling, você deve ser capaz de encontrar mais / melhores exemplos.

Outras dicas

OK, eu acho que tenho uma resposta para você.

zlib é uma biblioteca escrita pelo cara que escreveu o algoritmo deflate você não deseja implementar. Há uma DLL Win32 disponíveis. Aqui está o FAQ sobre a usá-lo a partir do Windows:

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

Confira questão 7. Os autores não parecem muito interessados ??em usuários do Windows, e não parece de todo interessado em usuários VB, mas enquanto eles são o suficiente para oferecer a biblioteca que podemos fazer o resto .

Se isto é o suficiente para ajudá-lo, então ótimo. Se você quiser ajudar com a chamada da biblioteca C do VBA adicionar um comentário e nós vamos descobrir isso. Eu não fiz nenhuma chamada VB-a-C em anos -. Parece divertido

Parece que você deseja abrir uma garrafa de vinho, mas você definitivamente se recusam a usar um saca-rolhas. Enquanto não há nenhuma função VBA permitindo que o gzipping de um arquivo, você não será capaz de fazer o trabalho sem algum ressource externo, como uma dll ou exe.

Se alguém queria arquivos compressa sem depender de software 3-parte que, em geral, implementá-lo como um objeto COM / DLL para que ele estaria disponível para mais do que apenas Excel. Se alguém queria incorporar zip funcionalidade em Excel eles iriam usar ferramentas 3-parte para que eles não teriam de voltar a implementar o algoritmo. Então você está nadando contra a maré. No entanto ...

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

Existem duas versões. O COM Add-in versão "... permite que você zip qualquer pasta de trabalho que foi salvo em disco (mas pode estar em um estado não salvo)." Ele se baseia em um componente do luar Software mas todos os componentes e set-up estão contidos no instalador. Não é de domínio público bastante mas a licença é menos restritiva do que a GPL. O resultado final é um add-in Excel (que utiliza um componente 3-party).

Mas se você realmente, realmente não querem quaisquer dependências sobre ferramentas externas ou você está indo ter que implementar o algoritmo de compressão de si mesmo ou esperar até que a Microsoft constrói essa funcionalidade no Windows e expõe através do Excel.

Espero que isso ajude.

Se você quiser implementar o algoritmo em VBA, você precisa (em VBA) Salve a planilha e, em seguida, usar as funções do VB I / O para abrir o arquivo, esvaziá-la e guardá-la novamente. Para todos os efeitos, é idêntico ao escrever um aplicativo VB comum que funciona em um arquivo. Talvez seja necessário colocar a macro VBA num livro separado para evitar "arquivo em uso" tipos de erros, mas se você reabrir o arquivo como somente leitura e guardá-lo com um nome diferente, você deve estar OK mantendo tudo em um livro.

Mas eu estou quase certo que descascar para fora para gzip de dentro do VBA seria funcionalmente idênticos e infinitamente mais fácil.

EDIT: Algumas código. Ele não falhou quando eu corri-lo, por isso é OK para manter tudo na mesma pasta de trabalho.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top