Как я могу сжать файл GZip из Excel VBA, используя только код в файле .xla?

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

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Оба найдены с помощью Google, вы сможете найти больше/лучших примеров.

Другие советы

Хорошо, я думаю, что у меня есть для тебя ответ.

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

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

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

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

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

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

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

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

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

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

Если вы хотите реализовать алгоритм в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top