Wie kann ich gzip eine Datei aus Excel VBA komprimiert nur mithilfe von Code in einer XLA-Datei?

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

Frage

Ich muß GZIP in der Lage sein, eine Datei in einer Excel-VBA-Funktion zu komprimieren. Insbesondere muss ich die ‚deflate‘ Algorithmus verwenden können.

Gibt es eine Möglichkeit, dies zu tun, ohne eine Kommandozeilen-Anwendung von exec mit? Ohne Abhängigkeit von externen Tools wird der Code robuster sein.

Im Idealfall Verwendung von vorinstallierten VBA oder COM-Bibliotheksfunktionen der Code würde -. Ich will nicht, diese Logik selbst haben, zu implementieren oder DLLs usw. installieren

Wenn möglich, möchte ich die Installation der Funktion so einfach sein wie eine XLA der verfügbaren Excel-Add-Ins hinzufügen. Kein DLLs, EXE-Dateien, Registry-Einträge, etc. erforderlich.

Bearbeiten Kann ich die Verwendung des .NET GZipStream macht dies zu tun?

War es hilfreich?

Lösung

VBA (das ist wirklich ein Dialekt von VB6 ist) ist langsam für diese Art von Anwendungen. Ich erinnere mich, einmal Shannon-Fano-Algorithmus auf VB6 implementiert und auf C, die C-Version war etwa 10 mal schneller, auch nachdem sie in einen DLLMain und von dort aufgerufen gedreht wird, anstatt auf einer Befehlszeile ausführbare Datei.

Es gibt viele COM-DLLs, die Kompression Dienste bereitstellen, sowohl Open-Source-und Shareware, und einige von ihnen implementieren GZIP der deflate-Algorithmus. Es wäre wirklich einfach nur von Ihrem VBA-Code aus einer solchen DLL eine Funktion aufzurufen, die Kompression in Ihrem Namen zu tun.

Ich verstehe nur ungern Ihr, etwas außerhalb Ihrer Anwendung auf verwenden, obwohl in diesem Fall könnten Sie eine Ausnahme für die Leistung willen haben anzuwenden.

In dem Bemühen, vollständig Ihren Spaß zu verderben, Datei zipfldr.dll auf Windows \ System32 zu untersuchen. Sie können sich auch Links einen Blick nehmen mögen:

Gefunden beide durch googeln, sollten Sie in der Lage sein, mehr / bessere Beispiele zu finden.

Andere Tipps

OK, ich glaube, ich habe eine Antwort für Sie.

zlib ist eine Bibliothek von dem Typ geschrieben, der den deflate-Algorithmus geschrieben Sie nicht wollen, zu implementieren. Es gibt einen win32-DLL zur Verfügung. Hier ist die Hilfe in Bezug auf die von Windows mit:

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

Überprüfen Sie heraus Frage 7. Die Autoren auf Windows-Anwender nicht zu scharf erscheinen, und überhaupt daran interessiert, nicht auf VB Nutzer scheinen, aber solange sie nett genug sind um die Bibliothek bieten wir den Rest tun können .

Wenn dies genug ist, um Ihnen zu helfen, dann groß. Wenn Sie mit dem Aufruf der C-Bibliothek von VBA helfen möchten, fügen Sie einen Kommentar und wir werden es herausfinden. Ich habe keine VB-to-C-Aufrufe in Jahren getan -. Es klingt wie Spaß

Es scheint, dass Sie eine Flasche Wein öffnen wollen, aber Sie sich weigern, auf jeden Fall einen Flaschenöffner zu verwenden. Solange es keine VBA-Funktion ist es, die Gzipping einer Datei erlaubt, werden Sie nicht in der Lage sein, den Job ohne eine externe Ressource wie ein DLL oder EXE-Datei zu tun.

Wenn jemand Dateien komprimieren wollte, ohne sie auf 3rd-Party-Software würden sie in der Regel implementieren sie als COM-Objekt / DLL, so dass es zu mehr als nur Excel zur Verfügung stehen würde. Wenn jemand Zip-Funktionalität in Excel zu übernehmen wollten sie würden 3rd-Party-Tools verwenden, damit sie nicht haben, um den Algorithmus neu zu implementieren. Sie sind also gegen den Strom schwimmen. Allerdings ...

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

Es gibt zwei Versionen. Die COM-Add-In-Version „... können Sie jede Arbeitsmappe zip, die auf der Festplatte gespeichert wurden (aber in einem nicht gesicherten Zustand sein kann).“ Es stützt sich auf eine Moonlight Software-Komponente, sondern alle Komponenten und Inbetriebnahme sind im Installer enthalten sind. Es ist nicht ganz public domain aber die Lizenz ist weniger restriktiv als die GPL. Das Endergebnis ist ein Excel-Add-in (d verwendet eine 3rd-Party-Komponente).

Aber wenn Sie wirklich, wirklich wollen keine Abhängigkeiten von externen Tools sind Sie entweder geht der Komprimierungsalgorithmus selbst implementieren müssen oder warten, bis Microsoft diese Funktionalität in Windows-Builds und setzt sie durch Excel.

Ich hoffe, das hilft.

Wenn Sie den Algorithmus in VBA implementieren möchten, würden Sie brauchen, um (in VBA) die Tabelle speichern und dann VB verwenden E / A-Funktionen, um die Datei zu öffnen, entleeren sie, und speichern Sie es erneut. Für alle Absichten und Zwecke ist es identisch eine gewöhnliche VB-Anwendung zu schreiben, die auf eine Datei funktioniert. Sie könnten den VBA-Makro in einer separaten Arbeitsmappe setzen müssen „Datei in Verwendung“ Arten von Fehlern zu vermeiden, aber wenn Sie die Datei als schreibgeschützt wieder öffnen und es mit einem anderen Dateinamen speichern Sie auf OK sein sollten alles in einer Arbeitsmappe zu halten.

Aber ich bin fast sicher, dass innerhalb der VBA auf gzip Beschuss aus würde funktional identisch sein und unendlich viel leichter.

EDIT: Einige Code. Es dauerte nicht scheitern, wenn ich es lief, so ist es in Ordnung, alles in derselben Arbeitsmappe zu halten.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top