При интеграции систем и выгрузке отчетов часто возникает типичная задача: имеется строка или текстовый файл, в котором данные разделены специальным символом (точкой с запятой, запятой или знаком табуляции). Требуется быстро и корректно преобразовать эти данные в файл Excel, распределив каждое значение по отдельным колонкам.
Разберем подробно, какими способами можно решить эту задачу — от базового программного заполнения табличного документа до оптимизированных подходов выгрузки больших массивов данных и прямой работы с CSV.
Рассмотрим классический способ, когда мы построчно считываем исходный текстовый файл, делим строки на массив подстрок по заданному символу-разделителю и заполняем ячейки объекта ТабличныйДокумент, после чего сохраняем результат в файл нужного формата.
Посмотрим на пример базовой реализации:
Таб = Новый ТабличныйДокумент;
Чтение = Новый ЧтениеТекста(ИмяФайла);
Стр = Чтение.ПрочитатьСтроку();
Ст = 1;
Пока Стр <> Неопределено Цикл
Кол = 1;
Для Каждого Ячейка Из СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр, Разделитель) Цикл
Таб.Область(Ст, Кол).Текст = Ячейка;
Кол = Кол + 1;
КонецЦикла;
Ст = Ст + 1;
Стр = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Таб.Записать(ИмяФайлаЭксель, ТипФайлаТабличногоДокумента.XLSX);
Проанализируем важные нюансы этого подхода:
Таб.Область(Ст, Кол).Текст работает достаточно медленно. На объемах данных свыше нескольких тысяч строк такой алгоритм приведет к заметным задержкам и повышенному потреблению оперативной памяти.ТипФайлаТабличногоДокумента.XLS, платформа столкнется с жестким ограничением формата Excel 97–2003 в 65 536 строк и 256 колонок. Для выгрузки значительных массивов данных (например, более 100 000 строк) всегда используйте ТипФайлаТабличногоДокумента.XLSX.Если требуется выгрузить десятки или сотни тысяч строк программно без прямых обращений к ячейкам, оптимизируем процесс. Заполним сначала ТаблицаЗначений, а затем выведем её в табличный документ одним вызовом через ПостроительОтчета.
Разберем по шагам, как это реализовать:
// Создаем таблицу значений с нужным числом колонок
ТЗ = Новый ТаблицаЗначений;
Для НомерКолонки = 1 По КоличествоКолонок Цикл
ТЗ.Колонки.Добавить("Колонка" + НомерКолонки, Новый ОписаниеТипов("Строка"));
КонецЦикла;
// Считываем файл и заполняем строки таблицы
Чтение = Новый ЧтениеТекста(ИмяФайла);
Стр = Чтение.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
Подстроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр, Разделитель);
НоваяСтрока = ТЗ.Добавить();
Для Индекс = 0 По Подстроки.ВГраница() Цикл
Если Индекс < ТЗ.Колонки.Количество() Тогда
НоваяСтрока[Индекс] = Подстроки[Индекс];
КонецЕсли;
КонецЦикла;
Стр = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
// Быстрый вывод таблицы через ПостроительОтчета
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
ТабДок = Новый ТабличныйДокумент;
Построитель.Вывести(ТабДок);
ТабДок.Записать(ИмяФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);
Этот способ отрабатывает в разы быстрее, поскольку формирование табличного документа происходит внутренними механизмами платформы на уровне C++, минуя накладные расходы на создание отдельных объектов областей.
Самый быстрый способ сформировать файл для Excel — вообще отказаться от генерации бинарных форматов XLS/XLSX средствами 1С и сохранить данные как текстовый файл с расширением .csv. Однако здесь пользователи часто сталкиваются с тем, что Excel открывает файл в одну колонку либо отображает нечитаемые символы («кракозябры»).
Выясним причину такого поведения и рассмотрим правила подготовки CSV-файла:
;). Если в файле используется запятая (,), Excel поместит всю строку в первую ячейку. Следовательно, для мгновенного открытия в русской версии Excel необходимо использовать точку с запятой.Windows-1251 (ANSI) либо в UTF-8 с BOM (Byte Order Mark). Если сохранить обычный UTF-8 без сигнатуры BOM, Excel интерпретирует файл как ANSI, что приведет к повреждению текста.
sep=,
Excel прочитает эту директиву при запуске и автоматически разобьет колонки по указанному символу, проигнорировав настройки Windows.Если файл уже сформирован сторонней системой и изменить его разделители в коде невозможно, его можно правильно открыть штатными средствами самого Microsoft Excel:
Таким образом, для программной автоматизации лучшим решением является выгрузка через ПостроительОтчета в формат XLSX либо формирование CSV с точкой с запятой в кодировке Windows-1251.