Сохранение табличного документа в EXCEL (xlsx) с форматом ячеек Число, Дата, Дата время
Часто требуется сформировать из 1С файл EXCEL, с сохранением типов у ячеек, Число или Дата, например.
И тут очевидные вещи превращаются в изобретение велосипедов.
Так как табличный документ не может сохранять ячейки в формате Дата, Дата время.
- Описание
- Подробнее
Описание
Для решения проблемы можно например использовать EXCEL через ком объект, но это замедляет работу. Да и сам Microsoft не рекомендует использовать ком объект EXCEL в серверных приложениях.
Можно напрямую писать весь документ, лист, в формат Office Open XML, работая как с xml файлом. Но тогда нужно в нем разбираться, понимать, знать. А самое главное поддерживать, вносить изменения, новые разработчики должны тоже уметь и т.д.
В данной статье предлагается простое универсальное решение:
1.Число
Тут все просто.
Если нужно, чтобы при сохранении у ячейки табличного документа, в файле excel было число, делаем так:
Область = ТабличныйДокумент.Область("R1C1:R1C1");
Область.СодержитЗначение = Истина;
Область.ТипЗначения = Новый ОписаниеТипов("Число");
Область.Значение = 2;//Число которое нужно сохранить
2. Дата, Дата время.
Тут сложнее, предлагается способ с небольшой пост обработкой стилей xlsx файла, универсальным методом.
Ниже подробнее, по шагам рассмотрим весь способ.
2.1 Формат дата в EXCEL.
На самом деле в EXCEL, на уровне хранения данных, нет понятия даты или времени.
Все хранится как число, обозначающее количество дней с 1 января 1900 г.
Пример:
0 — Пустая дата
1 — 01.01.1900
2 — 02.01.1900
И т.д.
А понимает EXCEL что это дата или время и т.д., с помощью форматных строк.
У ячеек есть понятие формата.
Из пункта 1, мы умеем сохранять формат число , через Табличный документ.
Таким образом реализовав простой метод, который будет конвертировать дату 1С, в число по стандартам EXCEL.
Мы можем в момент формирования Табличного документа, сразу писать xlsx файл как нужно.
И делать это все привычными средствами 1С, пример:
ДатаДляЗаписи=Строка(ТекущаяДата());
Область = ТабличныйДокумент.Область("R1C1:R1C1");
Область.СодержитЗначение = Истина;
Область.ТипЗначения = Новый ОписаниеТипов("Число");
Область.Значение = ПреобразоватьДатуСтрокойВФорматEXCEL(ДатаДляЗаписи);//Запишем в файл excel дату в виде числа
Остается только указать нужный нам формат даты.
Для этого мы будем использовать Имя шрифта.
Так как оно будет записано в файл стилей, как обычная строка.
При этом мы запомним, какие шрифты, на какие форматы мы заменили, что бы потом обратно сделать подмену.
Дополним наш код выше примером:
Формат="dd\.mm\.yyyy\ hh:mm:ss";//Именно в таком формате у нас будет отображаться дата, пользователю. в файле excel,
СоответствиеФорматаИмениШрифта=Новый Соответствие;
СоответствиеФорматаИмениШрифта.Вставить(Формат,Область.Шрифт.Имя);
Область.Шрифт = Новый Шрифт(Область.Шрифт,Формат);2.2 Универсальное редактирование стилей в файле XLSX.
Все стили у формата Office Open XML хранятся в xl\styles.xml.
После пункта 2.1, наша ячейка будет ссылаться на стиль, который будет записан с именем шрифта, равным нашей форматной строке.
Нам остается лишь:
-Тем стилям которые ссылаются на такой шрифт, указать форматную строку.
-Вернуть корректное имя шрифта.
Это можно обернуть в универсальный метод:
УстановитьФорматДатыВремяУЯчеекЧерезСтили(ПутьДоФайлаXLSX,СоответствиеФорматаИмениШрифта);
Внутри которого реализована модификация xl\styles.xml
