Entry tags:
Формат файлов Microsoft Office 2007
Я понимаю, вы сейчас скажете - "Ну, Артем, опомнился!... Баян!... Этой новости сто лет в обед!... Кто же этого не знает?...", но для меня это действительно стало открытием. Причем весьма неожиданным.
Дело в том, что по своей программерской надобности, мне нужно было на лету сгенерировать файл Microsoft Word 2007. Если кто знаком с программированием, то знает, что раньше, в старых версиях, это делалось либо вызовом ActiveX-COM объекта, или требовало наличия установленного Офиса с нелегальным открытием Word-а в скрытом режиме, генерации необходимого текста, сохранении файла и закрытии Word-а.
Если вы не просто знакомы с программированием, а на самом деле проделывали подобные штуки, то наверняка помните, сколько геморроя приходится хапать при этом увлекательном процессе вызова Микрософтовских Interop-объектов, которые например пишут, что убиваются из памяти, а на самом деле совсем не убиваются и продолжают висеть, вызывая memory leak-и, непонятные глюки и прочие занимательные пляски вокруг монитора. Особенно все это приятно проделывать если у вас не обычная десктопная программа, а Интернет-приложение, web-service или чего-то еще.
И даже если вы не знакомы с программированием и с компьютеромна "Вы" на "Ты" на "Шо?", наверняка замечали, что с недавних пор офисные документы вместо привычных форматов .doc и .xls стали приходить с незнакомыми расширениями .docx и .xlsx, которые не открываются нормальным Офисом, а обязательно требуют наличия нового Microsoft Office 2007 (это который с корявым интерфейсом, без привычного меню и с непонятными иконками).
Что делать, если в письме пришел файл в формате .docx, а Microsoft Office 2007 на компьютере не установлен? Ну, в принципе, можно скачать в Интернете всякие бесплатные перекодировщики, утилиты и так далее. Но все оказалось гораздо проще.



Файл с расширением .docx (Word 2007) или .xlsx (Excel 2007) это обычный zip-архив. Т.е. его можно без всяких проблем переименовать из .docx в .zip, наплевав на строгие предупреждения Виндовза, что "ай-ай-ай, что же вы делаете, ему же больно!", и открыть стандартным архиватором типа WinRar, WinZip (если я не ошибаюсь, начиная с версии Vista, винда может открыть архивы zip и стандартным проводником).
В архиве вы увидите несколько папок, по которым разложено содержание вашего документа, все картинки из текста в одной папке, сам текст в другой, шаблоны в третьей и так далее.
Это, кстати, еще и удобный способ быстро выдрать картинки из большого документа, даже если у вас есть возможность его открыть самим Word-ом.
Правда текст лежит не в привычном формате .txt, а в формате .xml (если быть точнее Open XML), но его легко можно открыть любым текстовым редактором (тем же Notepad.exe) или Internet Explorer-ом. Документ вполне можно прочесть и даже перетащить параграфы через копирование в буфер куда-нибудь в более доступный редактор.
Если же вернуться к к вопросу программной генерации файлов Word или Excel на лету, то теперь, оказывается, нет даже необходимости в наличии установленного на компьютере Офиса. Что в западных странах означает - нет нужды еще в одной лицензии, предназначенной не для пользования человеком, а для компьютерной программы, что вообще само по себе - нонсенс.
Просто сгенерировал нужный текст и сохранил его (хотя бы даже как текстовый файл - построчно) в виде .xml, потом положил все файлы в нужном порядке в нужные папки, зазиповал их используя какой-нибудь бесплатный dll-зиповщик, например ICSharpCode.SharpZipLib (гуглится) и переименовал получившийся файл в .docx
Все.
Дело в том, что по своей программерской надобности, мне нужно было на лету сгенерировать файл Microsoft Word 2007. Если кто знаком с программированием, то знает, что раньше, в старых версиях, это делалось либо вызовом ActiveX-COM объекта, или требовало наличия установленного Офиса с нелегальным открытием Word-а в скрытом режиме, генерации необходимого текста, сохранении файла и закрытии Word-а.
Если вы не просто знакомы с программированием, а на самом деле проделывали подобные штуки, то наверняка помните, сколько геморроя приходится хапать при этом увлекательном процессе вызова Микрософтовских Interop-объектов, которые например пишут, что убиваются из памяти, а на самом деле совсем не убиваются и продолжают висеть, вызывая memory leak-и, непонятные глюки и прочие занимательные пляски вокруг монитора. Особенно все это приятно проделывать если у вас не обычная десктопная программа, а Интернет-приложение, web-service или чего-то еще.
И даже если вы не знакомы с программированием и с компьютером
Что делать, если в письме пришел файл в формате .docx, а Microsoft Office 2007 на компьютере не установлен? Ну, в принципе, можно скачать в Интернете всякие бесплатные перекодировщики, утилиты и так далее. Но все оказалось гораздо проще.
Файл с расширением .docx (Word 2007) или .xlsx (Excel 2007) это обычный zip-архив. Т.е. его можно без всяких проблем переименовать из .docx в .zip, наплевав на строгие предупреждения Виндовза, что "ай-ай-ай, что же вы делаете, ему же больно!", и открыть стандартным архиватором типа WinRar, WinZip (если я не ошибаюсь, начиная с версии Vista, винда может открыть архивы zip и стандартным проводником).
В архиве вы увидите несколько папок, по которым разложено содержание вашего документа, все картинки из текста в одной папке, сам текст в другой, шаблоны в третьей и так далее.
Это, кстати, еще и удобный способ быстро выдрать картинки из большого документа, даже если у вас есть возможность его открыть самим Word-ом.
Правда текст лежит не в привычном формате .txt, а в формате .xml (если быть точнее Open XML), но его легко можно открыть любым текстовым редактором (тем же Notepad.exe) или Internet Explorer-ом. Документ вполне можно прочесть и даже перетащить параграфы через копирование в буфер куда-нибудь в более доступный редактор.
Если же вернуться к к вопросу программной генерации файлов Word или Excel на лету, то теперь, оказывается, нет даже необходимости в наличии установленного на компьютере Офиса. Что в западных странах означает - нет нужды еще в одной лицензии, предназначенной не для пользования человеком, а для компьютерной программы, что вообще само по себе - нонсенс.
Просто сгенерировал нужный текст и сохранил его (хотя бы даже как текстовый файл - построчно) в виде .xml, потом положил все файлы в нужном порядке в нужные папки, зазиповал их используя какой-нибудь бесплатный dll-зиповщик, например ICSharpCode.SharpZipLib (гуглится) и переименовал получившийся файл в .docx
Все.
no subject
да уж, намучался я в свое время с этим interop.excel, пока не перешел к xslt преобразованию в xmlный формат 2003 офиса.
А на опен пока рано переходить, не у всех откроет)
(no subject)
(Anonymous) - 2010-01-09 18:27 (UTC) - Expand(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
2) Как оказалось старый формат офисных файлов умеют генерить(читать-писать) скрипты на perl & PHP если хорошенько погуглить.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
no subject
спасибо.
фиииигасе.
no subject
Про двухтысячку не скажу, но открытие zip-архивов в виде папок было реализовано уже в WinXP.
no subject
no subject
no subject
Скажу тебе по секрету - вся Вселенная изначально представляет из себя самораспаковывающийся zip-архив, с абсолютной компрессией, к которому подобрал пароль где-то 14 миллиардов лет назад Великий Программист, которого мы все привыкли звать на три буквы.
Говорят, архивчик все еще не дораспокавался до конца..
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
З.Ы. и таки да, опен XML, который мелкософт так яростно пыталось задушить своим стандартом... =)
no subject
А еще docx можно использовать, если надо выковырять картинку из ворда в нормальном качестве. Файл можно сохранить в docx, а потом найти нужную картинку в архиве.
(no subject)
(no subject)
no subject
no subject
он и бесплатный и более удобный чем ворд
no subject
no subject
(no subject)
(no subject)
no subject
(no subject)
(no subject)
Зачем такие страсти?
no subject
no subject
(Anonymous) 2010-02-10 01:37 pm (UTC)(link)no subject