25.12.2017 Сергей Кулажевский 9616
Пример изменения настроек файлов 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.Записать();

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

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


Наши проекты

Компания IBS
Компания IBS

Отрасль:
Системный интегратор

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

- Интеграция систем – АСУП и «1С:Управление производственным предприятием»...

ООО «ПЛЮСПЭЙ»
ООО «ПЛЮСПЭЙ»

Отрасль:
Организацией расчетов посредством электронных средств платежа

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

- Разработка подсистемы оперативного учета транзакций...

ООО «Лаборатория успеха»
ООО «Лаборатория успеха»

Отрасль:
Общественное и плановое питание, гостиничный бизнес, туризм

Внедренное типовое решение:
1С:Зарплата и управление персоналом 8. КОРП

Кадровый учет;
Расчет зарплаты;...

Автоматизация кадрового учета на базе «1С:ERP Управление предприятием 2.0»
Автопредприятие ПАО «Газпром»

Отрасль:
Транспорт

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

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

Автоматизация документооборота в компании ООО "Ликард"
ООО «Ликард» (ОАО ЛУКОЙЛ)

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

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

- Отказ от бумажного документооборота, от громоздких систем на базе офисного...

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

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

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

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

Внедрение системы финансового учета БИТ:Финанс
ООО «Алькор и Ко» (Л’Этуаль)

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

Внедренное типовое решение:
БИТ.Финанс

- Финансовый учет;
- Поддержка проекта внедрения МСФО;
- Регламентные рабо...

Автоматизация торгового учета на базе "1С:Управление торговлей"
ООО «ТЕЛЕВЕС РУСС»

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

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

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

Внедрение ПП "1С:Бухгалтерия 8 ПРОФ" в ООО «Союз Три» (Кондитерский дом Renardi)
ООО «Союз Три»

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

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

Бухгалтерский учет
- Банк и касса
- Расчеты с контрагентами
Налоговый ...

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

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

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

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

АО "Нижегородский водоканал"
АО "Нижегородский водоканал"

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

Внедренное типовое решение:
1С:Зарплата и управление персоналом 8. КОРП

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

ПЭК
ПЭК

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

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

- Создание прототипа SRM-системы на базе «1С: Управление торговлей»
- Автомат...

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

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

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

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