Domanda

Devo essere in grado di comprimere un file GZip in una funzione VBA di Excel. In particolare, devo essere in grado di utilizzare l'algoritmo "deflate".

C'è un modo per farlo senza dover eseguire un'applicazione da riga di comando? Senza alcuna dipendenza da strumenti esterni, il codice sarà più robusto.

Idealmente il codice farebbe uso delle funzioni di libreria VBA o COM preinstallate - Non voglio implementare questa logica da solo o installare DLL ecc.

Se possibile, voglio che l'installazione della funzione sia semplice come aggiungere un .xla ai componenti aggiuntivi di Excel disponibili. Non sono richiesti DLL, EXE, voci di registro, ecc.

Modifica Posso utilizzare .NET GZipStream per fare questo?

È stato utile?

Soluzione

VBA (che in realtà è un dialetto di VB6) è lento per questo tipo di applicazioni. Ricordo che una volta ho implementato l'algoritmo Shannon-Fano su VB6 e su C, la versione C era circa 10 volte più veloce, anche dopo essere stata trasformata in un DLLMain e chiamata da lì anziché su un eseguibile da riga di comando.

Esistono molte DLL COM che forniscono servizi di compressione, sia open source che shareware, e alcune implementano l'algoritmo deflate di GZIP. Sarebbe davvero semplice chiamare una funzione da tale DLL dal tuo codice VBA per eseguire la compressione per tuo conto.

Comprendo che sei riluttante a utilizzare qualcosa di esterno alla tua applicazione, anche se in questo caso potresti dover applicare un'eccezione per motivi di prestazioni.

Nel tentativo di rovinare completamente il tuo divertimento, esamina il file ZIPFLDR.DLL su windows \ system32. potresti anche dare un'occhiata a questi link:

Trovato sia su Google, dovresti essere in grado di trovare esempi più / migliori.

Altri suggerimenti

OK, penso di avere una risposta per te.

zlib è una libreria scritta dal ragazzo che ha scritto l'algoritmo di deflazione che non si desidera implementare. È disponibile una DLL win32. Ecco le domande frequenti sull'utilizzo da Windows:

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

Leggi la domanda 7. Gli autori non sembrano troppo entusiasti degli utenti Windows e non sembrano affatto entusiasti degli utenti VB, ma finché sono abbastanza gentili da fornire la libreria possiamo fare il resto .

Se questo è abbastanza per aiutarti, allora fantastico. Se desideri aiuto per chiamare la libreria C da VBA, aggiungi un commento e lo scopriremo. Non ho fatto chiamate da VB a C da anni - sembra divertente.

Sembra che tu voglia aprire una bottiglia di vino ma ti rifiuti definitivamente di usare un apribottiglie. Finché non esiste una funzione VBA che consenta il GZipping di un file, non sarai in grado di fare il lavoro senza qualche risorsa esterna come un file dll o exe.

Se qualcuno volesse comprimere i file senza fare affidamento su software di terze parti, generalmente lo implementerebbero come un oggetto COM / DLL, quindi sarebbe disponibile a più di un semplice Excel. Se qualcuno volesse incorporare la funzionalità zip in Excel userebbe strumenti di terze parti in modo da non dover implementare nuovamente l'algoritmo. Quindi stai nuotando contro corrente. Tuttavia ...

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

Esistono due versioni. La versione del componente aggiuntivo COM " ... ti consente di comprimere qualsiasi cartella di lavoro che è stata salvata sul disco (ma potrebbe essere in uno stato non salvato). & Quot; Si basa su un componente Moonlight Software ma tutti i componenti e l'installazione sono contenuti nel programma di installazione. Non è proprio di dominio pubblico ma la licenza è meno restrittiva della GPL. Il risultato finale è un componente aggiuntivo di Excel (che utilizza un componente di terze parti).

Ma se davvero, davvero non vuoi dipendenze da strumenti esterni, dovrai implementare l'algoritmo di compressione o aspettare fino a quando Microsoft non creerà tale funzionalità in Windows e lo esporrà attraverso Excel.

Spero che questo aiuti.

Se si desidera implementare l'algoritmo in VBA, è necessario (in VBA) salvare il foglio di calcolo e quindi utilizzare le funzioni I / O di VB per aprire il file, sgonfiarlo e salvarlo di nuovo. A tutti gli effetti è identico a scrivere una normale applicazione VB che funziona su un file. Potrebbe essere necessario inserire la macro VBA in una cartella di lavoro separata per evitare " file in uso " tipi di errori, ma se riapri il file in sola lettura e lo salvi con un nome file diverso, dovresti essere OK mantenendo tutto in una cartella di lavoro.

Ma sono quasi certo che sborsare per gzip dall'interno del VBA sarebbe funzionalmente identico e infinitamente più facile.

MODIFICA: del codice. Non è fallito quando l'ho eseguito, quindi è OK tenere tutto nella stessa cartella di lavoro.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top