HelpF.pro

Функции сохранения таблицы значений в файл и чтения из файла

В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:

Порядок программных действий при выгрузке в файл выглядит так:

  • Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки);
  • Конвертируем таблицу значений в табличный документ;
  • Сохраняем табличный документ в MXL.

При загрузке таблицы порядок действий такой:

  • Читаем из файла табличный документ;
  • Конвертируем табличный документ в таблицу значений;
  • Используем эту таблицу значений в своих целях (загружаем в табличную часть).

Соответственно файл для хранения данных таблицы имеет расширение *.mxl.

Основные функции для реализации поставленной задачи следующие:

ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.

ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.

ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.

ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.

Код 1C v 8.3
 // Преобразовать табличный документ в таблицу значений.
//
// Параметры:
// ТабДок - <ТабличныйДокумент> - Исходный табличный документ;
// СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// КонецСтрока - <Число> - Строка конца области;
// КонецСтолбец - <Число> - Столбец конца области.
//
// Возвращаемое значение:
// <ТаблицаЗначений> - Полученная таблица значений.
//
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
 
// Определение габаритов таблицы
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1;
НачалоСтолбец = 1;
КонецЕсли;
 
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1;
Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение 
И НачалоСтрока < ТабДок.ВысотаТаблицы 
Цикл
НачалоСтрока = НачалоСтрока + 1;
КонецЦикла;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1;
Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение 
И НачалоСтолбец < ТабДок.ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1;
КонецЦикла;
КонецЕсли;
 
КонецСтрока = ?(КонецСтрока = Неопределено, ТабДок.ВысотаТаблицы, КонецСтрока);
КонецСтолбец = ?(КонецСтолбец = Неопределено, ТабДок.ШиринаТаблицы, КонецСтолбец);
 
// Преобразование
ЭтоТаблица = (ТипЗнч(СтруктураКолонок) = Тип("ТаблицаЗначений"));
ТабЗначений = ПолучитьТаблицуВывода(СтруктураКолонок);
 
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений.Добавить();
 
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ?(ЭтоТаблица, Колонка.Наименование, Колонка.Ключ);
пИндексКолонки = ?(ЭтоТаблица, Колонка.СтолбецОтчёт, ИндексКолонки);
 
Если ТабДок.Область(ИндексСтроки, пИндексКолонки).СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Текст;
КонецЕсли;
 
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
КонецЦикла;
 
Возврат ТабЗначений;
КонецФункции;

// Преобразовать таблицу значений в табличный документ.
//
// Параметры:
// ТабЗначений - <ТаблицаЗначений> - Исходная таблица значений;
// ТабДок - <ТабличныйДокумент> - Полученный табличный документ. Если параметр не задан, 
// то документ создаётся заново и возвращается функцией;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// ВыводитьЗаголовки - <Булево> - Определяет выводить ли имена колонок или нет.
//
// Возвращаемое значение:
// <ТабличныйДокумент> - Полученный табличный документ (возвращает параметр "ТабДок").
//
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
 
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли;
 
// Определение габаритов таблицы
НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока);
НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец);
 
// Преобразование
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок);
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЕсли;
 
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина;
ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения);
ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя];
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
 
Возврат ТабДок;
КонецФункции;

// Читает табличный документ из файла MXL и преобразует его в таблицу значений.
//
// Параметры:
// ИмяФайла - <Строка> - Путь к файлу MXL;
// СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок. Если этот параметр
// не задан, то структура колонок формируется из самого табличного документа;
// ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет.
//
// Возвращаемое значение:
// <ТаблицаЗначений> - Полученная таблица значений.
//
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
 
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла);
 
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Обл1 = ТабДок.Область(1, ИндексКолонки);
Обл2 = ТабДок.Область(2, ИндексКолонки);
ИмяКолонки = СокрЛП(Обл1.Текст);
ИмяКолонки = ?(Найти(ИмяКолонки, " ") > 0, СтрЗаменить(ТРег(ИмяКолонки), " ", ""), ИмяКолонки);
СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов));
КонецЦикла;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Обл2 = ТабДок.Область(1, ИндексКолонки);
ИмяКолонки = "К" + Формат(ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0");
СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов));
КонецЦикла;
КонецЕсли;
 
    Таблица = ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, ?(ЕстьЗаголовок, 2, 1), 1);
 
Возврат Таблица;
КонецФункции;

// Сохраняет таблицу значений в файле в виде табличного документа.
//
// Параметры:
// ИмяФайла - <Строка> - Путь к файлу MXL;
// ТабЗначений - <ТаблицаЗначений> - Сохраняемая таблица значений;
// ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет.
//
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
 
ТабДок = ПреобразоватьТЗвТД(ТабЗначений, Неопределено, 1, 1, ЕстьЗаголовок);
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);
 
КонецПроцедуры;

Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.

Табличный документ можно сохранить a файлы следующих типов:

  • ANSITXT - Текстовый документ
  • DOCX - документ MS Word
  • HTML
  • HTML3
  • HTML4
  • HTML5
  • MXL
  • MXL7
  • ODS - Файл Open Office
  • PDF - файл Acrobat Readr
  • TXT - Текстовый документ
  • XLS - файл Excel
  • XLS95 - файл Excel95
  • XLS97 - файл Excel97
  • XLSX - файл Excel2010

Код 1C v 8.3
 // Получаем таблицу значения из файла. 
Функция ЗагрузитьТЗизФайла(ИмяФайла)    
    Путь = КаталогВременныхФайлов() + ИмяФайла; 
    Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8); 
    стрТЗ = Текст.Прочитать(); 
    Текст.Закрыть(); 
    // получим таблицу значений из строки
    ТЗ = ЗначениеИзСтрокиВнутр(стрТЗ);    
    Возврат ТЗ;    
КонецФункции    

// Заполнить ячейки в строке  значениями 
//
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
    НомерКолонки = 1;
    Символ160 = Символ(160);    
    // цикл по колонкам таблицы
    // РезультатЗапроса.Колонки.Количество()    // - количество колонок
    Для каждого полеТЗ из ЗаписьТЗ цикл 
        // значения ячейки в Excel
        типПоляТЗ = ТипЗнч(полеТЗ);
        если типПоляТЗ = Тип("Число") тогда             
            полеТЗ=Строка(полеТЗ); 
            полеТЗ=СтрЗаменить(полеТЗ,Символ160,"");
            полеТЗ=СтрЗаменить(полеТЗ,",",".");
        иначеесли типПоляТЗ = Тип("Строка") тогда      
        иначе        
            полеТЗ = строка(полеТЗ);
        КонецЕсли;    
        имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
        имяОбласти = СтрЗаменить(имяОбласти,Символ(160),"");         
        Ячейка = ТабличныйДокумент.Область(имяОбласти);
        Ячейка.Текст = полеТЗ;
        НомерКолонки = НомерКолонки + 1;
    КонецЦикла;            
КонецФункции

// Заполнить наименованиями колонок таблицу
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
    // массКолонки = новый массив();
    номерСтроки=1;
    номКолонки=1; 
    ТабличныйДокумент = новый ТабличныйДокумент;
    // цикл по коллекции колонок
    Для НомКол=0 по ТаблицаЗначений.Колонки.Количество() - 1 Цикл
        //Сообщить(Колонка.Имя + "(" + Колонка.ТипЗначения + ")" );            
        имяКолонки=ТаблицаЗначений.Колонки[НомКол].Имя;
        //ТабличныйДокумент.Область(
        имяОбласти = "R" + номерСтроки + "C" + номКолонки;
        имяОбласти = СтрЗаменить(имяОбласти,Символ(160),"");         
        Ячейка = ТабличныйДокумент.Область(имяОбласти);
        //значениеЯчейки = СтрЗаменить(имяОбласти,Символ(160),"");         
        Ячейка.Текст = имяКолонки;
        // на основе текущего шрифта сделаем Жирный
        ЖирныйШрифт = ?(ЖирныйШрифт = Неопределено,Новый Шрифт(Ячейка.Шрифт,,,Истина),ЖирныйШрифт);         
        Ячейка.Шрифт = ЖирныйШрифт;
        номКолонки = номКолонки + 1;        
    КонецЦикла;
КонецФункции


// Заполнить построчно табличный документ
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
    //Выборка = РезультатЗапроса.Выбрать();
    НомСтр=1; // заполняем данными начиная со 2-й строки    
    // цикл по строкам таблицы
    Для каждого записьТЗ из ТаблицаЗначений Цикл
        НомСтр = НомСтр + 1;
        // цикл по колонкам таблицы        
        ЗаписьТЗ2ТабДок(записьТЗ,НомСтр,ТабличныйДокумент);         
    КонецЦикла;    
КонецФункции

// Таблица значений в табличный документ
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
    ТабличныйДокумент = новый ТабличныйДокумент;
    // вывести колонки
    НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент);
    // вывести содержимое таблицы    
    Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент);
    ТабличныйДокумент.Записать(ФайлMxl,ТипФайлаТабличногоДокумента.MXL);
    ТабличныйДокумент.Показать(ФайлMxl,ФайлMxl);
    Возврат 0;
КонецФункции


Функция    Тест_ВыгрузитьТЗвMxl();
    файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat";        
    ТЗ = ЗагрузитьТЗизФайла(файл_мТЗИсходныеДанные);    
    ФайлMxl = КаталогВременныхФайлов() + СтрЗаменить(файл_мТЗИсходныеДанные,".dat",".mxl");  
    ТаблицаЗначений2Mxl(ТЗ,ФайлMxl);
КонецФункции

Тест_ВыгрузитьТЗвMxl();

Пример выгруженной таблицы значений в файл:


Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1837.html