Как заархивировать файл эксель
Во вложении - файл, при запуске которого автоматически срабатывает такой макрос
При открытии этого файла, если включены макросы, в папке My Program Backups будет сохранена копия книги в формате ZIP (архив)
Папка, если таковая не существует, будет автоматически создана макросом.
Функция для разархивирования (извлечения файлов из архива ZIP)
Комментарии
Ни разу с таким не сталкивался (не делал многотомные архивы), так что не могу подсказать
Подскажите пожалуйста как создать многотомный архив ZIP и задать размер частей.
Подскажите пожалуйста а как добавить к имени архива путь исходного файла - это нужно например в том случае если имена документов одинаковые? а расположение разное (с учетом того что архив создается не в текущей папке как в примере, а в одну конкретную папку - например D:\backup). Используя приведенный пример(с изменением папки назначения) невозможно отличить резервную копию файла "отчет1" из папки "декабрь" от "отчет1" из папки "ноябрь"
Функция Zip_File ругается если в пути архивируемого файла есть символы «». Есть ли способ обойти это ограничение?
Дмитрий, да, так и должен делать этот код.
Так устроена работа с ZIP в windows
Для распаковки можно использовать WinRAR - быстрее будет. Примеры кода вроде были у меня на сайте.
Подскажите, это только у меня при использовании функции UnZip_File в момент, когда исполняется оператор
oApp.Namespace(DestinationFolder).CopyHere oApp.Namespace(FileNameZip).Items
система автоматически создает в TEMP (c:\Documents and Settings\User\Local Settings\Temp\) папку "Временная папка 1 для имя.zip"
куда параллельно распаковывает архив. Из-за чего извлечение происходит значительно медленнее архивации
При использовании ThisWorkbook.SaveCopyAs FileNameXls
все гиперссылки на папки в сетевом окружении в текущем файле изменяют своё значение с Папка1\Папка2 на ..\Папка1\Папка2
Причем количество "..\" зависит от места копирования, прописанного в FileNameXls (чем глубже папка сохранения относительно текущего файла, тем больше "..\").
Соответственно, все ссылки в текущем файле перестают работать.
Программа продолжает работу с оригинальным файлом
Если нужна копия листа - нужен немного другой код:
1) создаете копию 4-го листа методом Copy
например, ThisWorkbook.worksheets(4).copy
2) сохраняете активную книгу (которая создалась при копировании листа) под заданным именем
например: ActiveWorkbook.SaveAs FileNameXls
3) закрываете книгу-бекап без повтороного сохранения:
ActiveWorkbook.Close False
PS: если сами не разберетесь - всегда можно оформить заказ на сайте
Подскажите пожлста, у меня 2 вопроса. Первый-с каким файлом будет продолжена работа после сохранения, с тем который забэкапился или с оригиналом? И второй- можно ли как то сохранять не всю книгу, а определенный лист от нее? Например-программа состоит из 4 листов, на 4 листе сводная информация. Нужно чтобы создалась копия файла, только с этим единственным 4 листом.
[quote]но код приведён в другой статье.[/quote]
Не подскажете в какой?
Поиском по сайту не могу найти.
А зачем прописывать в коде какую-то задержку.
Команды ведь последовательно выполняются, - пока архив не создастся, письмо не начнёт формироваться.
И вообще, - в каком формате-то вы архив создаете?
Вы пишете комментарий в статье, где пример кода только для ZIP архивов, - они создаются медленно, средствами Windows.
А изначально вы писали про архив RARб - там совсем другой макрос используется, более надежный и быстрый, - но код приведён в другой статье.
Спасибо за разьяснения.
Тут собственно из папки размером 42мб получается архивный файл 5,6 мб и задержка во времени вот пока эти 5,6 мб пишутся на диск.
У меня сделано сейчас с задержкой времени на 8 сек перед отправкой файла, а на другом компе оказывается этого времени мало, нужно увеличивать.
Вот и думал, может как-то можно этот момент проскочить:).
Виктор, без файла не получится.
Даже если бы получилось (что невозможно без реализации алгоритма WinRAR в VBA) - к письму-то всё равно прикрепляется именно файл, а не область оперативной памяти.
WinRAR моментально создает архивы (если вы не многомегабайтные файлы формируете), - так что не понимаю, в чем проблема.
Сделал на основе Ваших кодов архивирование и отправку на почту рабочей папки с помощью WinRar.
Все получается, но возник вопрос:
Есть-ли возможность не создавать(не писать на диск) файл .rar, т.е. создавать его в памяти?
Сейчас у меня работает все классически - создается папка, из нее файл архива пишется на диск, затем удаляется исходная папка (командой rar), файл архива отправляется на почту и затем удаляется. Самое ненужное здесь - это запись на файла на диск перед отправкой, да и время занимает, приходится как-то выкручиваться, ждать перед отправкой файла на почту.
Если запускать на жестком диске (даже подключенном по USB) - работает. При запуске с флэшки ищет новые тома архива (? :) ) (w7x64 office2k10 x64)
Здравствуйте, Дмитрий.
Конечно, это возможно.
Оформляйте заказ на сайте, прикрепляйте свой файл с макросом,
подробно опишите, что, куда, под каким именем, и как часто, должно сохраняться.
Для создания архивов RAR нужна программа WinRAR - она у вас установлена?
Это конечно все хорошо, у меня такой вопрос, у меня имеется макрос который сохраняет книгу, дубликат, с последующей замены его, и создает дубликат на каждый месяц, суть в чем, мне бы хотелось видоизменить этот макрос, что бы сохранял в архив.rar, возможно ли такое?
С Уважением Дмитрий!
И начнем мы с того, зачем нам нужно архивировать данные? Как уже было сказано, для того чтобы уменьшить объем этих данных. Но сразу оговорюсь получить значительное уменьшение размера данных можно только с некоторыми типами файлов. Например, видео, музыку или фото сжать сильно, не получится, так как данные файлы уже сами по себе сжатые, поэтому если Вы соберетесь архивировать фильмы не рассчитывайте на то, что у Вас размер файла, например, с 2 гигов уменьшится до 500 мегабайт, он может и уменьшиться, но совсем не значительно. Другое дело если Вы собираетесь архивировать большой объем документов, формата Word, Excel или PDF, здесь Вы получите уменьшение объема данных в несколько раз, например, мне приходилось архивировать достаточно большой объем данных в формате PDF, точно не помню, но что-то около 2-2,5 гигабайт, и программой 7-Zip, которую мы будем рассматривать чуть ниже, я сжал эти данные примерно до 250-300 мегабайт! По-моему это просто отлично, тем более что мне эти данные приходилось передавать через Интернет, а как Вы знаете, что передать объем в 300 мегабайт значительно быстрей, чем 2 гига, даже если у Вас хорошая скорость Интернета.
Ну, хватит вступления, переходим к самой теме статьи, т.е. программе 7-Zip.
И самый главный плюс этой программы не в том, что она хорошо сжимает данные, а в том, что она бесплатная, т.е. я хочу сказать, что аналогичные программы являются платными, хотя по работе не чем не лучше 7-zip.
Установка программы 7-Zip
Примечание! Мы будем устанавливать программу 7zip версии 9.20 на ОС Windows 7.
Запускаем инсталлятор, и на первом окне нам предложат выбрать путь установки данной программы, я оставляю по умолчанию, и жмем install
Далее программа быстро установится и нам останется нажать Finish.
Теперь давайте просто запустим данную программу, чтобы посмотреть на нее, и узнать, где можно менять настройки. Для этого нажимаем Пуск->Все программы->7zip->7-Zip File Manager
И у Вас откроется следующее окно, своего рода файловый менеджер, в котором Вы можете передвигаться по своей файловой системе, с целью заархивировать что-нибудь или разархивировать.
Также здесь Вы можете задать настройки программы, например, какие типы файлов по умолчанию открывать 7zip или например язык программы, для этого просто заходите в меню Сервис->Настройки
Как заархивировать файл
Здесь программа предлагает несколько вариантов архивирования, например, через 7-Zip File Manager, чуть выше мы его рассматривали и, конечно же, через контекстное меню файла или папки. В общем, кому как удобней. Мы же давайте рассмотрим вариант без запуска 7-Zip File Manager, а просто через правую кнопку заархивируем файл.
Допустим, у нас есть Excel файл размером в 35 мегабайт
Мы щелкаем правой кнопкой мыши по этому файлу, т.е. вызываем меню для работы с этим файлом, и выбираем 7zip->Добавить к архиву
Затем у нас откроется окно, в котором мы зададим некие настройки сжатия. Так как мы начинающие мы особо вдаваться в подробности не будем, единственно давайте сожмем файл с максимальной степенью сжатия и для этого выберем «Уровень сжатия» «Ультра», также можно задать имя будущего архива, я оставлю как есть
После того как Вы нажмете ОК, в той же папке (если Вы не меняли путь) появится архивированный файл.
Как видите, файл сжался в несколько раз, что, по-моему, очень хорошо.
Как разархивировать архив (извлечь данные)
Для того чтобы разархивировать архив, мы щелкаем правой кнопкой по файлу архива (в нашем случае Тестовый файл.7z) выбираем 7zip->распаковать здесь это если Вы хотите распаковать в туже папку, в которой находится сам архив
А если Вы хотите распаковать в другую папку, то выбирайте просто «Распаковать», и в этом случае у Вас откроется окно выбора места, куда необходимо распаковать.
Также если Вам необходимо сразу просто посмотреть данные в архиве Вы можете, как обычно открыть файл с архивом путем двойного нажатия левой клавиши мыши и в этом случае у Вас откроется 7-Zip File Manager, где Вы увидите все данные в данном архиве. Также здесь Вы можете и извлечь их.
На этом я думаю для основ достаточно, программа не сложная, поэтому разобраться в ней не составит труда даже начинающему пользователю компьютера. Удачи!
Нажимаю открыть и вместо открытия excel'я открывается архив в архиве с какими-то непонятными мне файлами и папками. Проблема появилась на новом пк (win10), на старом все нормально. Один и тот же ексель в архиве открываю на старом пк-все ок, на новом-появляется это (скрин). Office лицензионный, ворд файлы тоже нормально открываются, проблема только с excel.Что не так?
Уже и rar и zip архивирование использовала, разные версии архиваторов пробовала-все бестолку. На рабочем столе или папке, то есть не в архиве, эксель открывается нормально, поэтому, то что мне писали в предыдущем вопросе про "открыть с помощью. " и "распакуй и открой"-это тоже не решение проблемы. Мне нужно чтобы файл открывался именно из архива, чтобы паролем ограничить к нему доступ
дело в том, что по своему формату файлы майкрософт офиса 2007 и более новых версий являются зип-архивами с определённой структурой. почему они открываются в винраре, а не в экселе, задавай вопросы авторам винрара.
и да, "паролем ограничить доступ" можно и в самом экселе, не прибегая к извращениям с архиваторами.
просто в архиве не один только эксель, а множество файлов разных форматов, поэтому я ставила на один архив пароль и при необходимости оттуда открывала все что мне надо. это было удобно, чем паролить по отдельности
KPbICMAH Искусственный Интеллект (109225) тогда, как вариант, попробовать не винрар, а какой-нибудь 7-зип. или поступить хитрее и сохранить файл в формате экселя 97-2003 – посмотреть чем это кончится. тут мне трудно советовать, потому что для зипов я пользуюсь встроенной виндовой утилитой, а для всего остального – FAR Manager-ом.
" нужно чтобы файл открывался именно из архива, чтобы паролем ограничить к нему доступ" - в архивах файлы НЕ ОТКРЫВАЮТСЯ. В любом случае, файл будет распакован во временную папку, а после правки и сохранения и закрытия программы, архив будет перепакован, с уже изменённым файлом.
Вот, тут и засада - злоумышленник, при желании, может или напрямую умыкнуть файл из этой папки, или попытаться его восстановить.
Новый формат Excel - это архив и есть. Если открыть любой excel'евский файл архиватором - это и увидите.
А чтобы открывался не как архив, надо ассоциации восстановить, чтобы файлы xlsx открывались в Excel.
То, что "Вам нужно" - это не более, чем факт Вашей биографии. Непосредственно из архива файл excel можно открыть, если он заархивирован, а не открыт как архив, коим он по сути и является. Т. е. архивируйте winrar'ом, и открывайте непосредственно из окна winrar. Это, конечно, маразм, но другой надежной защиты в MS Office нет. Вся встроенная защита взламывается "на раз".
По ПКМ на файле есть такой пункт "Открыть с помощью". Выберите Excel и поставьте галку в пункт "Всегда использовать эту программу. ".
PS А, все, увидел. Вы из архива оказывается открываете. Тогда смотрите настройки в самом архиваторе. В обведенном красным не должно быть расширений файлов Excel. И для просмотра должна быть выбрана ассоциированная программа.
Кстати, xlsx - это Excel 2007 и выше. Там уже всё хорошо с защитой в самом Excel (чем выше версия формата - тем лучше). При условии, что пароль будет нормальный и сильный - случайные символы разных регистров и наборов (буквы, цифры, спецсимволы) длиной как минимум 6 символов. Но помните, что если пароль потеряется восстановить его будет так же непросто, как и злоумышленнику. :)
И правильно Вам выше про ассоциации файлов сказали. Они нарушены. Система почему-то пытается открыть такой файл в WinRar'е, вместо того чтобы вызывать Excel.
И совсем не правильно Вам там рекомендуют пароль устанавливать. Защита листа/книги - это защита от случайных изменений. Данные не шифруются, файл открывается, а пароли снимаются мгновенно для всех версий Excel.
Правильная защита - это пароль на открытие. Он устанавливается при сохранении файла, а данные шифруются и без пароля недоступны. Как установить такой пароль описано, например, вот здесь - [ссылка заблокирована по решению администрации проекта]
Просто добавьте расширение в настройках xlsx как на картинке
Можно ли сжать файл (таблицы в Ексель) в 10 раз в формате zip? Как это сделать?
Файл с Excel файлами весит 2 гб, а сжать их в формате zip до 200 мб?
Простой 5 комментариев
Если файл xlsx, рекомендую фокус: переименуйте его из xlsx в zip и откройте.
Секрет фокуса, как уже писали в ответах, в том, что xlsx это фактически zip-контейнер, в котором все хранится.
Его можно сархивировать в zip\что угодно другое, и если выставить высокую степень сжатия, оно ужмется еще, но не так сильно, как старый excel.
Например, имею файл 1.4мб xlsx, архив в zip с максимальной степенью сжатия дал архив с размером 1 мб. Так что на 10 раз я бы не рассчитывал.
Сохранение этого же файла в xlsb дало результат 1.3мб. Zip-архивирование с максимальным сжатием xlsb 1.3 мб дало архив с размером 1.2 мб.
В общем, ответ - нет.
CSV - это текстовый формат для обмена между различными программами и он отлично сжимается. Этот формат не имеет прямого отношения к Excel, а просто ассоциирован с ним в Windows и при его открытии происходит операция импорта.
ZIP - это контейнер, в который можно сжимать файлы с различными алгоритмами сжатия. Если используется WinZIP из последних версий, то в нем есть поддержка сильных алгоритмов сжатия, таких как BZIP2, LZMA.
Имеет смысл импортировать CSV в какую-либо нормальную БД, ну хоть в Access.
Зависит от содержимого.
Чудес на свете не бывает. Для того или иного типа файлов подходит определенный алгоритм архивации.
Можно поиграться с ключами архиватора.
Раньше, кстати, была такая вещь, как . Zip-бомба
Файл архива маленький, а при распаковке занимал сотни мегабайт, для времен когда диски были меньше гига было неприятное явление. Сам файл состоял из нулей, единиц, пробелов. Они очень хорошо паковались.
Зип бомба и сейчас есть, можно терабайт упаковать в файл примерно метр. И да ни каких нулей и едениц, там строго однотипные данные, например все единицы. Это упаковывается гораздо лучше
Коэффициент сжатия зависит от данных, которые содержатся в этом Excel файле.
Если там в основном содержаться текстовые данные, то вполне реально сжать такой файл в 10 раз, но это зависит от алгоритма и уровня сжатия.
Когда вы выполните архивацию исходного Excel файла в архив, тогда и сможете узнать во сколько раз zip-алгоритм позволяет сжать те данные, которые содержатся в Excel файле.
Для файлов больших чем несколько мегабайт Вам желательно все-таки скачать программу на локальные компьютер, установить её, а затем уже выполнять процесс сжатия.
Это существенно ускорит время обработки.
Как известно, файл Excel — это просто набор XML-файлов, определяемых форматом Office Open XML и упакованных в zip-архив, и потому для генерации нового файла помимо специализированных библиотек можно воспользоваться библиотеками для XML и zlib. Как обойтись без внешних зависимостей — под катом.
Основная идея: взять заранее подготовленный шаблон xlsx файла с пустым листом, запихнуть в нужное место несжатые (zip-формат это позволяет) XML-данные листа и пересчитать некоторые байты в заранее известных местах. Такой способ нетребователен к CPU, но получаемые файлы значительно больше по размеру, чем обычные.
Для начала рассмотрим структуру zip-архива
Пример архива из двух файлов. Источник CodeProject
Как видно каждый файл кодируется четырьмя блоками, два из которых опциональны. Каждый блок имеет специальную сигнатуру (последовательность из 4-х байт), которая в текстовом редакторе выглядит как PK. что позволяет легко определять начало этих блоков. Local Header помимо сигнатуры содержит поля: размер сжатых данных файла, размер несжатых данных, контрольную сумму CRC32 для данных и другие. Central Header содержит те же данные, что и File Header, на который ссылается, а так же указание места, где File Header находится (число байт от начала файла, так называемый offset) и некоторые другие. End of Central Dir (EOCD) содержит число файлов в архиве и место первого Central Header. Формат zip предполагает обработку с конца файла, т.е. сначала читается EOCD секция, потом Central Header нужного файла, по нему находится File Header и потом выполняется переход к сжатым данным. Более подробное описание структур и полей можно увидеть здесь.
Примерный вид sheet1.xml (добавлены переносы строк и отступы для читаемости)
Hex-данные исправленного архива в Hex-редакторе HxD.
Обратите внимание, что используется обратный порядок байт, так сигнатура 0x04034b50 записана как 50 4b 03 04 , а длина файла sheet1.xml — 0x0000020C = 0x20C = 524 (байт) как 0С 02 00 00 .
В соответствии с документацией File Header имеет следующую структуру
Открыв архив, в hex-редакторе визуально легко найти данные sheet1.xml . Чуть выше находится сигнатура PK — это и будет началом File Header. Встав на нее справа (красная полоска), получим выделение слева (толстый красный квадрат) и позицию 0x17E3 в строке состояния — это положение от начала файла заголовка File Header для файла sheet1.xml .
Учитывая, что тип uint32_t — это 4 байта, а uint16_t — два, получаем следующую картинку, где
голубой прямоугольник — сигнатура, оранжевый — метод сжатия, два серых — дата и время изменения файла и синий — это контрольная сумма, за которой идут два зеленых, содержащих сжатый и несжатый размеры.
Чтобы внести изменения после вставки данных листа на позицию 3, отмеченную стрелочкой, необходимо из hex-редактора выписать в скольких байтах от начала файла находятся следующие поля (ниже приводятся получившиеся значения в моем файле template.xlsx ):
- CRC = 0x17F1 . Добавив +4 получится смещение для сжатого размера, и еще +4 несжатого
- Начало данных файла (стрелка 2) = 0x1819
- Место куда будут дописаны данные (стрелка 3) = 0x1969
- Конец данных файла = 0x1A24
- CRC в Central Header для sheet1.xml = 0x1C69
- Отступ в EOCD = 0x1CAF и старое значение в нем 0x1A25 , которое нужно будет увеличить на длину добавленных данных
- В массив байт читаются данные шаблона
- Вычисляется «накапливаемый» CRC32, сначала по данным шаблона от начала данных (2) до тега sheetData (3), потом по вставляемым данным, а потом от sheetData до конца файла
- Обновляются биты CRC и длины в структурах FileHeader и Central Header в массиве байт
- Формируется результирующий массив, как данные файла из шаблона до тега sheetData + вставляемые данные + данные шаблона после sheetData , который и будет итоговым результатом.
где 2 указывает на второй узел в файле xl\sharedStrings.xml .
Таким образом Excel экономит место, храня одинаковые строки как одно значение. Чтобы не менять в архиве еще и sharedString , строки можно писать сразу в sheet1.xml , применив атрибут inlineStr :
Не стоит забывать про маскирование спец-символов XML — < >& ' " символов. В итоге должно получаться что то вида
Сам Excel заполняет больше XML-атрибутов, например номера строк и используемые диапазоны, но они опциональны.
Читайте также: