25.12.2017 Сергей Кулажевский 9646
Пример изменения настроек файлов Excel (xlsx)...
Доброго времени суток, уважаемый читатель. В этой статье я хочу рассказать об одном быстром методе изменения настроек файлов excel. Данный способ я открыл для себя сам. И предлагаю его для ознакомления, а не как завершенный функционал. Надеюсь, это будет полезно, и натолкнет Вас на продолжение данной темы.

Предисловие: 

Дано: 1С:Документооборот 2.0. Серверный вариант. Excel установлен у некоторых пользователей локально, на сервере не установлен, и такой возможности нет.

Задача: Реализовать возможность сохранения табличного документа в файл xlsx с обязательной альбомной ориентацией при печати страницы. Табличный документ (печатная форма) формируется при записи внутреннего документа, и прикладывается файлом. Файл обновлять при каждой записи.

Варианты решений, к которым я пришел:

1) Первый, думаю, самый простой: если есть табличный документ и есть метод «ОриентацияСтраницы», почему этим не воспользоваться:
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.Записать(ИмяФайла);

Но меня ждало разочарование. Это работает только для табличного документа, и не переносит настройки в xlsx.

2) Второй способ: использование старого доброго ole.

 

Пример рабочий, но как было сказано выше, Ексель не установлен на сервере и приходилось все делать на медленных компьютерах пользователей. Выполнение данного кода занимало около 1 минуты. Было решено запускать com соединение при запуске сеанса пользователя, и потом к нему только обращаться, это ускорило обработку на 30%. Но появилась новая проблема: при некорректном завершении работы пользователей сеанс Екселя оставался, и так они начали плодиться. Тогда я решил «а что, если попробовать править файл напрямую, поняв, что именно меняется». Почитав про Open XML и сам формат xlsx, стало ясно одно: по сути xlsx документ - это архив с xml файлами. Попробуем распаковать xlsx в временную папку:
 


Смотрим в сформированную папку и видим такую структуру:

 


Чтобы понять, какой файл изменен, я распаковал файл, который был до обработки через com и после нее, и начал сравнивать все файлы с помощью notepad++, используя инструмент compare. В результате вышел на файл по пути «\xl\worksheets\sheet1.xml» в нем была разница строк:
 


Можно, конечно, было использовать запись xml или dom, но пошел напролом:
 


Теперь осталось только заархивировать с сохранением путей.

В результате получился файл с альбомной ориентацией, на формирование которого ушла 1 секунда, при этом не используя никакие дополнительные компоненты. По аналогии можно определить и реализовать другие методы.

Выкладываю весь текст функции:

ИД = Новый УникальныйИдентификатор();
ВременнаяПапка=КаталогВременныхФайлов()+ИД;
СоздатьКаталог(ВременнаяПапка);
Архиватор = Новый ЧтениеZipФайла(ИмяФайла);
//восстанавливаем относительные пути в архиве
Режим=РежимВосстановленияПутейФайловZIP.Восстанавливать;
Для индекс=0 По Архиватор.Элементы.Количество()-1 Цикл
Архиватор.Извлечь(Архиватор.Элементы[индекс], ВременнаяПапка+"\", Режим);
КонецЦикла;
Архиватор.Закрыть();
УдалитьФайлы(ИмяФайла);
Файл = ВременнаяПапка+"\xl\worksheets\sheet1.xml";
ТекстовыйДокИзФайла = Новый ТекстовыйДокумент; 
ТекстовыйДокИзФайла.Прочитать(Файл); 
НашТекстИзФайла = ТекстовыйДокИзФайла.ПолучитьТекст();
Если Найти(НашТекстИзФайла,"pageSetup ")=0 тогда
НашТекстИзФайла = СтрЗаменить(НашТекстИзФайла,"</worksheet>",
"<pageSetup paperSize=""9"" fitToHeight=""0"" orientation=""landscape"" r:id=""rId1""/></worksheet>");
ИначеЕсли Найти(НашТекстИзФайла,"orientation=""portrait""")<>0 тогда
НашТекстИзФайла = СтрЗаменить(НашТекстИзФайла,"orientation=""portrait""","orientation=""landscape""");
ИначеЕсли Найти(НашТекстИзФайла,"orientation=""landscape""") = 0 тогда
НашТекстИзФайла = СтрЗаменить(НашТекстИзФайла,"pageSetup ","pageSetup orientation=""landscape"" ");
КонецЕсли;
ТекстовыйДокИзФайла.УстановитьТекст(НашТекстИзФайла);
ТекстовыйДокИзФайла.Записать(Файл);
ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайла);
ЗаписьZIP.Добавить(ВременнаяПапка+"\"+"*.*",РежимСохраненияПутейZIP.СохранятьОтносительныеПути,РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
ЗаписьZIP.Записать();

Всем спасибо за внимание!

Сергей Кулажевский,
Руководитель отдела внедрения ООО “Кодерлайн”.


Наши проекты

Внедрение «1С:Бухгалтерия 8 ПРОФ» в компании «Мостехника»
ООО «Мостехника»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Бухгалтерия ПРОФ

Документооборот (ECM):
- Учет рабочего времени;
Управление персоналом и ка...

Автоматизация складских операций на базе «1С:Предприятие 8. WMS Логистика. Управление складом»
ОАО «Фрейт Линк»

Отрасль:
Логистика и грузоперевозки

Внедренное типовое решение:
1С:Управление холдингом

Реализовали разработку уникального модуля «Интернет-магазины» на базе прог...

Внедрение ПП «1С:Предприятие 8. Аренда и управление недвижимостью на базе "1С:Бухгалтерия 8"» в компании «Бутово Молл»
ООО «Бутово Молл»

Отрасль:
Недвижимость

Внедренное типовое решение:
1С:Аренда и управление недвижимостью на базе «1С:Бухгалтерия 8»

Управление продажами, логистикой и транспортом (SFM, WMS, TMS):
- Оформление зак...

Автоматизация интеграции с информсистемами клиентов на базе «1С:Предприятие 8. WMS Логистика. Управление складом»
ОАО «Фрейт Линк»

Отрасль:
Логистика и грузоперевозки

Внедренное типовое решение:
«1С:Предприятие 8. WMS Логистика. Управление складом»

– Управление складскими запасами;
– Оформление заказов покупателей;
– ...

Внедрение 1С:Управление торговлей в оптово-розничной компании «Много Плитки»
ООО «Много Плитки»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

Закупки (снабжение) и управление отношениями с поставщиками:
- Оформление ...

МИР ХОББИ
МИР ХОББИ

Отрасль:
Торговля. Интернет магазин

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Оформление заказов поставщикам
Взаиморасчеты с покупателями
Оформление...

ООО "РУКАРД-АУРА"
ООО "РУКАРД-АУРА"

Отрасль:
Профессиональные услуги

Внедренное типовое решение:
1С:Комплексная автоматизация

- Налоговый учет;...

ФГОУ ВПО «Горский государственный аграрный университет»
ФГОУ ВПО «Горский государственный аграрный университет»

Отрасль:
Образование

Внедренное типовое решение:
1С:Колледж ПРОФ

- Управление персоналом и кадровый учет (HRM):
Кадровый учет
Управление об...

ПАО «АрселорМиттал Кривой Рог»
ПАО «АрселорМиттал Кривой Рог»

Отрасль:
Металлургическая промышленность

Внедренное типовое решение:
1С:Управление производственным предприятием для Украины

- Кадровый учет
- Расчет зарплаты
- Регламентированная отчетность
- Уч...

ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"
ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"

Отрасль:
Деятельность больничных организаций

Внедренное типовое решение:
БИТ:Управление медицинским центром 8

- Управление отношениями с клиентами (CRM)
- Делопроизводство
- Ведение но...

ООО «Мир Аксиомы»
ООО «Мир Аксиомы»

Отрасль:
Аудиторские и консалтинговые услуги

Внедренное типовое решение:
1С:Бухгалтерия КОРП

- Бухгалтерский учет:
Банк и касса
Завершение периода
Нематериальные ...

ООО «ПКП КАБЭЛЕКТРОСНАБ»
ООО «ПКП КАБЭЛЕКТРОСНАБ»

Отрасль:
Производство кабельной продукции

Внедренное типовое решение:
1С:Управление небольшой фирмой 1.6

- Оформление заказов покупателей;
- Управление складскими запасами;
- Ана...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение