При работе с импортом номенклатуры или других справочников часто возникает задача перенести не просто «голый» текст из Excel, а сохранить его оформление: жирность, курсив, подчеркивание, цвет шрифта и переносы строк. Стандартное чтение ячеек возвращает только значение, теряя всю визуальную информацию. Разберем, как решить эту задачу программно, особенно когда данные имеют разное форматирование внутри одной и той же ячейки.
Начиная с современных релизов платформы 1С:Предприятие 8.3, объект ТабличныйДокумент научился довольно корректно интерпретировать файлы Excel. Рассмотрим этот способ как самый простой и быстрый для реализации.
Алгоритм действий следующий: мы читаем файл Excel целиком в объект ТабличныйДокумент, а затем обращаемся к каждой ячейке. Платформа автоматически преобразует стили Excel в свойства области табличного документа.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Для Ряд = 1 По ТабДок.ВысотаТаблицы Цикл
Область = ТабДок.Область(Ряд, 1); // Читаем первую колонку
// Если в ячейке сложный текст, свойство СодержитФорматированнуюСтроку будет Истина
Если Область.СодержитФорматированнуюСтроку Тогда
ФормСтрока = Область.Текст; // Здесь будет объект типа ФорматированнаяСтрока
Иначе
ФормСтрока = Область.Текст; // Обычная строка
КонецЕсли;
// Теперь необходимо преобразовать это в ФорматированныйДокумент для записи в справочник
ПолеФД = Новый ФорматированныйДокумент;
ПолеФД.УстановитьHTML(ПолучитьHTMLИзФорматированнойСтроки(ФормСтрока), Новый Структура);
КонецЦикла;
Проанализируем ситуацию: данный метод отлично работает, если форматирование единообразно для всей ячейки. Однако, если внутри одной ячейки часть слова красная, а часть синяя, объект ФорматированнаяСтрока в табличном документе может не всегда точно передать все нюансы при программном обращении. В таких случаях нам потребуются более мощные инструменты.
Если нам критически важно вытащить посимвольное форматирование, мы можем воспользоваться объектом Excel.Application. Этот метод позволяет достучаться до коллекции Characters внутри каждой ячейки.
Разберем по шагам, как это работает. Мы перебираем ячейку по фрагментам и формируем HTML-код, который впоследствии загрузим в ФорматированныйДокумент. Посмотрим на пример реализации логики:
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
Ячейка = Лист.Cells(1, 1);
ТекстЯчейки = Ячейка.Value;
ДлинаТекста = СтрДлина(ТекстЯчейки);
РезультатHTML = "<html><body>";
Для и = 1 По ДлинаТекста Цикл
Символ = Ячейка.Characters(и, 1);
ТекШрифт = Символ.Font;
// Определяем теги оформления
ОткрывающийТег = "";
ЗакрывающийТег = "";
Если ТекШрифт.Bold Тогда
ОткрывающийТег = ОткрывающийТег + "<b>";
ЗакрывающийТег = "</b>" + ЗакрывающийТег;
КонецЕсли;
Если ТекШрифт.Italic Тогда
ОткрывающийТег = ОткрывающийТег + "<i>";
ЗакрывающийТег = "</i>" + ЗакрывающийТег;
КонецЕсли;
// Получаем цвет (преобразуем из формата Excel в RGB)
Цвет = ТекШрифт.Color;
ЦветHTML = ПреобразоватьЦветВHex(Цвет);
ОткрывающийТег = ОткрывающийТег + "<span style=""color: " + ЦветHTML + """>";
ЗакрывающийТег = "</span>" + ЗакрывающийТег;
РезультатHTML = РезультатHTML + ОткрывающийТег + Сред(ТекстЯчейки, и, 1) + ЗакрывающийТег;
КонецЦикла;
РезультатHTML = РезультатHTML + "</body></html>";
Книга.Close(Ложь);
Excel.Quit();
Важный момент: использование COM-объектов — это самый медленный способ. Если в вашем файле тысячи строк, такая обработка может затянуться на часы. Рассмотрим более производительный вариант для больших объемов данных.
Выясним причину высокой скорости этого метода: файлы формата .xlsx представляют собой ZIP-архивы, внутри которых лежат XML-файлы. Данные о форматировании текста хранятся в файле xl/sharedStrings.xml.
Проанализируем структуру этого файла. Каждая ячейка со сложным текстом представлена узлом <si>, который содержит несколько узлов <r> (run). Каждый узел <r> содержит свойства <rPr> (font, color, bold) и непосредственно текст <t>.
Рассмотрим порядок действий для реализации этого метода:
.xlsx как обычный ZIP-архив с помощью средств 1С (объект ЧтениеZipФайла).sharedStrings.xml через ЧтениеXML.<b/> превращается в <strong>, а узел <color rgb="FFFF0000"/> в соответствующий CSS-стиль.Этот путь требует написания сложного парсера, но он работает в десятки раз быстрее, чем COM-соединение, и не требует наличия установленного Microsoft Excel на сервере или клиенте.
После того как мы получили HTML-представление текста одним из вышеописанных способов, нам нужно поместить его в 1С. В управляемых формах для этого используется тип ФорматированныйДокумент.
Обратите внимание на следующий программный код:
// Предположим, ПеременнаяHTML содержит наш сформированный код
ДокументОбъект = Новый ФорматированныйДокумент;
ДокументОбъект.УстановитьHTML(ПеременнаяHTML, Новый Структура);
// Для хранения в базе данных используем ХранилищеЗначения
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.ОписаниеФорматированныйТекст = Новый ХранилищеЗначения(ДокументОбъект);
НовыйЭлемент.Записать();
При выводе на форму достаточно связать реквизит формы типа ФорматированныйДокумент с элементом управления Поле форматированного документа. Платформа сама отрисует все стили, которые мы так бережно перенесли из Excel.
Подведем итог: для разовых задач и простых таблиц идеально подойдет метод с ТабличныйДокумент.Прочитать(). Если же требуется ювелирная точность переноса каждого выделенного слова в огромных прайс-листах, стоит инвестировать время в разработку парсера XML-структуры XLSX-файла.