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

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

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

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

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

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

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

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

Автоматизации учета затрат и расчета себестоимости с использованием конфигурации «Koderline: Управление проектами строительства скважин»
ООО «Буровая сервисная компания «ГРАНД»

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

Внедренное типовое решение:
«Koderline: Управление проектами строительства скважин»

Учет и планирование:
- собственную разработку компании «Кодерлайн» – конф...

Апгрейд 1С:Бухгалтерия 8 ПРОФ (USB) до версии 1С:Бухгалтерия 8 КОРП (USB)
ООО «Ява Строй»

Отрасль:
Строительство

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

- Создание чистых конфигураций. Внесение изменений в БД ЗУП и новая расчетна...

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

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

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

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

ФГУП «Почта России»
ФГУП «Почта России»

Отрасль:
Почта, доставка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ООО «Еврорадиаторы»
ООО «Еврорадиаторы»

Отрасль:
1С:ERP 2.4

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

Специалисты «Кодерлайн» помогли перенести базу из текущей системы «1С:ERP 2.2» ...

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

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

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

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