25.12.2017 Сергей Кулажевский 9569
Пример изменения настроек файлов 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С:Управление торговлей" в ОАО "Авиазапчасть"
ОАО «Авиазапчасть»

Отрасль:
Авиационно-космическая промышленность

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

- Оптовая торговля;
- Оформление заказов покупателей;
- Планирование прод...

Разработка функциональных требований к информсистеме на базе «1С:Управление холдингом 8»
ФГУП «СВЯЗЬ-безопасность»

Отрасль:
Охранные услуги

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

- Зафиксировали процессы по блокам бухгалтерского, налогового учета, казнач...

Внедрение ПП "1С:Бухгалтерия 8 ПРОФ" в ООО "ДЕКОР"
ООО «ДЕКОР»

Отрасль:
Производство

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

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

Внедрение 1С:Управление торговлей
ООО «Амперсенд»

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

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

- Оформление заказов поставщикам;
- Управление отношениями с поставщиками;...

Фирма 1С
Фирма 1С

Отрасль:

Внедренное типовое решение:
1С:Документооборот

- Подготовка функциональной модели прикладного решения «1С:Документооборот...

Внедрение ПП "1С:CRM ПРОФ" в ООО «Торговый Дом Факел»
ООО «Торговый Дом Факел»

Отрасль:
Производство

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

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

1с-РАРУС МСК
1с-РАРУС МСК

Отрасль:
Разработка компьютерного программного обеспечения

Внедренное типовое решение:

- Совместная работа по внедрению разных решений, в том числе «1С:ERP Управление...

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

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

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

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

ООО “РТИТС”
ООО “РТИТС”

Отрасль:
Транспортные системы

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

Блок регламентированного кадрового учета и расчета заработной платы в 1С:ERP;...

ЗАО «Инвестгеосервис»
ЗАО «Инвестгеосервис»

Отрасль:
Нефтесервис

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

Объемно-календарное планирование производства Автоматизация бизнес-проце...

ПЭК
ПЭК

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

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Перевод зарплатных баз с версии ЗУП 2.5 на версию ЗУП 3.1.
- Сопровождение в п...

Московский филиал ООО «Авиакомпания «Икар»
Московский филиал ООО «Авиакомпания «Икар»

Отрасль:
Авиаперевозки

Внедренное типовое решение:
1С:Зарплата и управление персоналом

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

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

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

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

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