Как можно сжать файл GZip из Excel VBA, используя код только в файле .xla? - PullRequest
3 голосов
/ 03 октября 2008

Мне нужно иметь возможность сжать файл GZip в функции Excel VBA. В частности, мне нужно иметь возможность использовать алгоритм «deflate».

Есть ли способ сделать это без запуска приложения командной строки? Без зависимости от внешних инструментов код будет более надежным.

В идеале код должен использовать предустановленные функции библиотеки VBA или COM - я не хочу сам реализовывать эту логику или устанавливать библиотеки DLL и т. Д.

Если возможно, я хочу, чтобы установка функции была такой же простой, как добавление .xla к доступным надстройкам Excel. Не требуется DLL, EXE, записи реестра и т. Д.

Редактировать Могу ли я использовать .NET GZipStream для этого?

Ответы [ 5 ]

4 голосов
/ 03 октября 2008

VBA (что на самом деле является диалектом VB6) медленный для такого рода приложений. Я помню, как однажды реализовал алгоритм Шеннона-Фано на VB6 и на C, версия C была примерно в 10 раз быстрее, даже после того, как ее превратили в DLLMain и вызывали оттуда, а не из исполняемого файла командной строки.

Есть много COM DLL, которые предоставляют сервисы сжатия, как с открытым исходным кодом, так и условно-бесплатные, и некоторые из них реализуют алгоритм дефляции GZIP. Было бы очень просто просто вызвать одну функцию из такой DLL из вашего кода VBA, чтобы выполнить сжатие от вашего имени.

Я понимаю, что вы неохотно используете что-то внешнее для вашего приложения, хотя в этом случае вам, возможно, придется применить исключение для повышения производительности.

Чтобы полностью испортить себе удовольствие, изучите файл ZIPFLDR.DLL в windows \ system32. Вы также можете взглянуть на эти ссылки:

Найдя оба через поиск в Google, вы сможете найти больше / лучших примеров.

3 голосов
/ 04 октября 2008

ОК, думаю, у меня есть для вас ответ.

zlib - это библиотека, написанная парнем, который написал алгоритм дефляции, который вы не хотите реализовывать. Доступна Win32 DLL. Вот часто задаваемые вопросы об использовании его из Windows:

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

Проверьте вопрос 7. Авторы, кажется, не слишком заинтересованы в пользователях Windows и совсем не заинтересованы в пользователях VB, но пока они достаточно любезны, чтобы предоставить библиотеку, мы можем сделать все остальное .

Если этого достаточно, чтобы помочь вам, тогда отлично. Если вам нужна помощь с вызовом библиотеки C из VBA, добавьте комментарий, и мы разберемся с этим. Я не делал никаких звонков с VB на C в течение многих лет - это звучит весело.

0 голосов
/ 04 октября 2008

Если кто-то хочет сжать файлы, не полагаясь на стороннее программное обеспечение, они обычно реализуют его как COM-объект / DLL, чтобы он был доступен не только для Excel. Если бы кто-то хотел включить функциональность zip в Excel, он использовал бы сторонние инструменты, чтобы им не пришлось повторно реализовывать алгоритм. Итак, вы плывете против течения. Однако ...

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

Есть две версии. Версия надстройки COM «... позволяет заархивировать любую книгу, которая была сохранена на диск (но может находиться в несохраненном состоянии)». Он основан на компоненте Moonlight Software, но все компоненты и настройки содержатся в установщике. Это не совсем общественное достояние, но лицензия менее ограничена, чем GPL. Конечным результатом является надстройка Excel (которая использует сторонний компонент).

Но если вы действительно, действительно, не хотите никаких зависимостей от внешних инструментов, вам придется либо самостоятельно реализовать алгоритм сжатия, либо подождать, пока Microsoft встроит эту функцию в Windows и покажет ее через Excel.

Надеюсь, это поможет.

0 голосов
/ 04 октября 2008

Кажется, что вы хотите открыть бутылку вина, но вы определенно отказываетесь использовать открывалку для бутылок. Пока нет функции VBA, разрешающей GZipping файла, вы не сможете выполнять эту работу без какого-либо внешнего ресурса, такого как файл dll или exe.

0 голосов
/ 03 октября 2008

Если вы хотите реализовать алгоритм в VBA, вам нужно (в VBA) сохранить электронную таблицу, а затем использовать функции ввода-вывода VB, чтобы открыть файл, сдуть его и снова сохранить. По сути, это идентично написанию обычного приложения VB, которое работает с файлом. Вам может потребоваться поместить макрос VBA в отдельную рабочую книгу, чтобы избежать ошибок типа «файл используется», но если вы снова откроете файл как доступный только для чтения и сохраните его с другим именем файла, все будет в порядке, сохраняя все в одной книге.

Но я почти уверен, что обстрел gzip из VBA будет функционально идентичен и бесконечно проще.

РЕДАКТИРОВАТЬ: Некоторый код. Когда я его запустил, он не потерпел неудачу, поэтому можно хранить все в одной книге.

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
...