Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлами Office 2007 из командной строки

Автор: Vladimir Shadow
15 июля 2010 года

После того как Microsoft ввела новые форматы в пакете Office 2007 жить пользователям стало гораздо интересней. Несовместимость с предыдущими версиями без установки конвертера и попытки привыкнуть к интерфейсу в виде ленты были лишь малой частью возникших проблем. Но данная статья не об этом, она о том, что можно сделать с документом формата Office 2007/2010 из командной строки, даже если у вас не установлен Microsoft Office.

Сначала немного теории, формат Office 2007/2010 представляет собой подвид XML, внутри он содержит специальным образом отформатированный текст с которым можно работать любым текстовым редактором. Снаружи мы видим файл с расширением docx, представляющий собой архив формата ZIP. Следовательно, для работы нам понадобится архиватор понимающий ZIP и блокнот. Все действия мы будем автоматизировать используя bat файлы.

Для начала нам понадобится исходный документ формата docx. Его можно создать самостоятельно или взять из архива, вместе с остальными примерами к статье. Для начала создадим на диске C папку для рабочих файлов и назовем ее  OfficeXMLBat. С помощью Microsoft Word создаем внутри папки документ с  именем Source.docx примерно такого содержания:

Для начала мы сделаем так, чтобы после запуска пакетного файла в поле Дата автоматически прописывалась сегодняшняя дата. Для начала нам необходимо выбрать архиватор работающий со стандартными ZIP архивами, остановим свой выбор на 7-ZIP. Из всего комплекта поставки , для работы в консоли, нам понадобятся только два файла 7z.exe и 7z.dll. Для тех у кого этот архиватор уже установлен необходимые файлы обычно находятся в папке Program Files\7-Zip, остальным проще взять эти файлы из архива или установить 7-ZIP. Сначала извлечем содержимое из документа Source.docx в папку Source, сделать это можно из вашего любимого архиватора или из консоли 7z.exe x Source.docx -oC:\OfficeXMLBat\Source\ -aoa. В результате в папке Source будет создан набор файлов из которых и состоит документ формата Office 2007/2010. Из всех представленных файлов нам будет интересен только один, из папки word, с именем document.xml, в котором и хранится содержимое документа. Откроем его в обычном блокноте или вашем любимом HEX редакторе (правой кнопкой по файлу - Открыть с помощью - Блокнот ;). Внутри ищем строку 01.05.1980, которую мы будем менять на сегодняшнюю дату. Принцип работы будет такой - мы выделяем и копируем весь текст до строки 01.05.1980 после чего вставляем его в отдельный файл, а потом копируем содержимое после строки 01.05.1980 и вставляем в другой файл. Для работающих в блокноте понадобится открыть еще один экземпляр блокнота, в который будет вставляться результат копирования. При сохранении из блокнота не забываем выбрать кодировку UTF-8 и поместить результат в папку OfficeXMLBat.

В примере, первый файл называется part1.txt, а второй part2.txt. Описание как надо выделять, копировать и сохранять в блокноте, я опущу  - должен же быть у этой статьи минимальный порог вхождения ;). В результате у нас получается две половинки исходного файла с вырезанной датой. Легко представить, что склеив две половинки с сегодняшней датой и вставив получившийся файл обратно в архив мы получим  нужный нам результат. Осталось это все реализовать в виде bat файла.
Сначала определимся откуда будет запускаться командный файл, для нас это папка  на диске c с именем OfficeXMLBat, поэтому первой строкой в командном файле будет переход в эту папку:

cd /D c:\OfficeXMLBat

Теперь выведем в файл с именем date.txt сегодняшнюю дату

date /t > date.txt

Склеим файлы part1.txt date.txt part2.txt в один общий файл с именем document.xml и сохраним его в папку Source\word

copy /B part1.txt+date.txt+part2.txt c:\OfficeXMLBat\Source\word\document.xml

Осталось собрать документ обратно, заархивировав содержимое папки Source в документ с именем Create.docx

7z.exe a -tzip -r c:\OfficeXMLBat\Create.docx c:\OfficeXMLBat\Source\*.*

На этом написание скрипта закончено, после запуска получившегося батника в папке появится файл Create.docx, открыв который мы увидим сегодняшнюю дату

Весь получившийся батник сохранен в файле create.bat, исходный текст:

cd /D c:\OfficeXMLBat
date /t > date.txt
copy /B part1.txt+date.txt+part2.txt c:\OfficeXMLBat\Source\word\document.xml
7z.exe a -tzip -r c:\OfficeXMLBat\Create.docx c:\OfficeXMLBat\Source\*.* 

В принципе этого достаточно для понимания как это все работает. Создадим еще один пример, более сложный. В файл Create2.docx будем добавлять не только дату, но и время, кроме того будем проверять папку на наличие файла report1.txt, если он есть то в колонке "Отчет сдал" впишем Да, иначе Нет. Получится этакая система контроля сдачи отчета.

Для начала разрежем файл document.xml на 4 части, разделителями послужат строки Дата (01.05.1980), Время (10:55), Отчет сдал (Да). В результате в папке будет 4 новых файла, part1b.txt part2b.txt part3b.txt part4b.txt, которые мы будем склеивать в новый документ. Осталось переписать скрипт:

cd /D c:\OfficeXMLBat
date /t > date.txt
time /t > time.txt
echo No > rep.txt
if exist c:\OfficeXMLBat\report1.txt echo Yes > rep.txt
copy /B part1b.txt+date.txt+part2b.txt+time.txt+part3b.txt+rep.txt+part4b.txt c:\OfficeXMLBat\Source\word\document.xml
7z.exe a -tzip -r c:\OfficeXMLBat\Create2.docx c:\OfficeXMLBat\Source\*.*

Первые три строчки это переход в нужную папку и вывод текущего времени и даты в соответствующие файлы. Потом идет проверка существования файла report1.txt и, в зависимости от этого, в файл rep.txt выводится Yes или No. Последние две строки склеивают все в один документ и упаковывают его в архив. Дабы не засорять пример непечатными символами в примере Да/Нет выводится на английском языке, в готовом варианте здесь можно писать по русски, но только в кодировке UTF-8, например сохраняя файл из блокнота. После запуска скрипта и открытия файла Create2.docx мы увидим следующее:

Заботливый Word подчеркнул надпись на английском, но в целом поставленная задача успешно решена. Если в нашу рабочую папку закинуть файл report1.txt любого размера, то после запуска скрипта надпись No сменится на Yes, что как бы показывает что отчет сдан.

Подобный метод несложно распространить на Linux/Unix и любые другие системы со встроенным скриптовым языком. В принципе то же самое может делать простейшая программа на любом языку высокого уровня, но помня как, сисадмины относятся к незнакомым exe файлам на сервере, консольный метод можно тоже признать жизнеспособным. Недостатком можно посчитать привязку к архиватору 7-Zip, но использовать архивацию в ZIP, встроенную в Windows, из консоли неудобно, а другие консольный архиваторы никто не отменял. В конце концов, можно воспользоваться DOS архиватором родом из 80-х PKZIP или написать оболочку для zlib - простор для модификаций огромен ;). Все примеры к статье можно скачать здесь.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог