KoderLine
Обслуживание
и внедрение
Наш Facebook Наш Instagram Наш YouTube
+7 (495) 374 55 29 Обратный звонок
Кодерлайн приглашает на День Бухгалтерии в Большом Московском цирке
Пример изменения настроек файлов Excel (xlsx)...

Пример изменения настроек файлов Excel (xlsx) без использования компонент. Пример в 1С:Документооборот.

0
764
25.12.2017 Сергей Кулаженко
Доброго времени суток, уважаемый читатель. В этой статье я хочу рассказать об одном быстром методе изменения настроек файлов 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.Записать();

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

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


Задать вопрос автору статьи
Тема вопроса*
Ваше имя*
E-mail или телефон*
Ваш вопрос*
 

Добавить комментарий
Текст сообщения*
Защита от автоматических сообщений
 
Теги
#1С: CRM #1С: ERP #1С: ERP Управление строительной организацией #1С: ERP. Управление буровой компанией #1С: WMS Управление складом #1С: Аренда и управление недвижимостью #1С: БУХ #1С: Договорчики #1С: Документооборот #1С: ЗУП #1С: Интеграция #1С: КА #1С: Колледж #1С: Конвертация данных #1С: Платформа #1С: Розница #1С: Сценарное тестирование #1С: ТОИР #1С: УАТ #1С: УКФ #1С: Университет #1С: УНФ #1С: УПП #1С: Управление строительной организацией #1С: УТ #1С: УХ #ADO #APACHE #API #com-объекты #Excel #GoogleDrive #HTTP #ITIL #Koderline: Управление медиа-холдингом #Koderline: Управление проектами строительства скважин #LINUX #MS SQL Server #WEB #WEB-сервисы 1С #Word #XML #Администрирование 1С #Безопасность сервера #Бесшовная интеграция #БИТ.Финанc #Битрикс24 #Блокировки в 1С #БСП #БУ #Бурение скважин #Бюджетирование #Внедрение #Внедрение ERP #Закрытие месяца #Запросы 1С #Интеграция 1С #Как сделать в 1С #Конвертация данных #Корпоративное сопровождение #Лизинг #Лицензии 1С #Моделирование #МСФО #Налоги #Обмен между базами #Обновления #Оптимизация #Отпуск #Отчетность #Отчеты в 1С #Оценка задач #Перенос данных #Планирование #Полезные обработки #Правила обмена #Проводки 1С #Программирование в 1С #Программные права #Продажи #Производство #Расширение конфигурации #РСБУ #СКД #Сравнение конфигураций #Тестирование 1С #Техническое задание #Торговое оборудование #Транспортная логистика #Управление проектами #Финансовый учет #Ценообразование #Экзамен 1С #Яндекс.Касса Email или телефон
Услуги программиста 1С
Получите специалиста  
для решения всех задач
в области 1С
Программы 1С
Цены и подробное описание программ 1С:Предприятие 8.
Яндекс.Метрика