Импорт и заполнение табличного поля (таблицы значений) из файла Excel

Диалог выбора файла

Выберем режим для диалога выбора файла, в данном случае это открытие:

Режим = РежимДиалогаВыбораФайла.Открытие;

Создадим сам диалог выбора:

ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);

Выберем имя для файла, пригодится если файл имеет точное имя но может находится в разных местах.

ДиалогОткрытияФайла.ПолноеИмяФайла = "";

Создадим фильтр, в данном случае расширение xls.

Фильтр = "Текст(*.xls)|*.xls"; 
ДиалогОткрытияФайла.Фильтр = Фильтр;

Отключим множественный выбор

ДиалогОткрытияФайла.МножественныйВыбор = Ложь;

Зададим заголовок для окна выбора, что бы пользователь понимал что от него хотят.

ДиалогОткрытияФайла.Заголовок = "Выберите файл для импорта клиентов";

Проверим что пользователь выбрал файл и сохраним путь к файлу в переменную.

Если ДиалогОткрытияФайла.Выбрать() Тогда
  ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
Если ПустаяСтрока(ПутьКФайлу) Тогда
  Предупреждение("Импорт прерван, т.к. не выбран файл.");
  Возврат; // прерывание
КонецЕсли;

Открытие приложения Excel

Пытаемся создать COm объект приложения excel, если произойдет ошибка выполнится блок Исключение и выдастся ошибка и прекратится работа процедуры.

Попытка
  ПоказатьОповещениеПользователя("Импорт",,"Загрузка Microsoft Excel...");
  ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
  Сообщить("Ошибка при загрузке файла." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
  Возврат;
КонецПопытки;

Открываем файл, аналогично контролируем на ошибки при помощи функции Попытка. Так же показываем маленькое оповещение пользователю.

Попытка
  ПоказатьОповещениеПользователя("Импорт",,"Открытие файла Microsoft Excel...");
  Файл = ExcelПриложение.WorkBooks.Open(ПутьКФайлу);
Исключение
  Сообщить("Ошибка открытия файла." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;

Обрабатываем файл

Читаем нужный лист и узнаем кол-во листов, если произошла ошибка закроем приложение. Если не закрывать, то в некоторых случаях excel будет недоступен пока не завершитель его процесс.

Попытка
  ПоказатьОповещениеПользователя("Обработка",,"Обработка файла Microsoft Excel...");
  Лист = Файл.Sheets(1); // Читаем данные первого листа книги
  // Определить количество строк и колонок выбранного листа книги Excel
  xlCellTypeLastCell = 11;
  ПоследняяСтрока = Лист.Cells.SpecialCells(xlCellTypeLastCell).Row;
  ПоследняяКолонка = Лист.Cells.SpecialCells(xlCellTypeLastCell).Column;
Исключение
  Сообщить("Ошибка открытия листа 1." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
  ExcelПриложение.Quit();
КонецПопытки;

Создадим цикл по строкам, если требуется перебирать столбцы можно сделать по ним. У меня банальный файл из трех столбцов фамилия имя и отчество.

Для Строка = 1 По ПоследняяСтрока Цикл
 //если строк много его можно прервать при помощи CTRL+BREAK
 ОбработкаПрерыванияПользователя();
 Попытка
   ПроверкаПустота = Лист.Cells(Строка, 1).Value;
   Если ПроверкаПустота <> " " тогда 
     // создадим строку
     Стр = Объект.ТабличнаяЧасть.Добавить();
     Стр.Фамилия = Лист.Cells(Строка, 1).Value;
     Стр.Имя = Лист.Cells(Строка, 2).Value;
     Стр.Отчество = Лист.Cells(Строка, 3).Value;
   конецесли;
 Исключение
   Сообщить("Ошибка чтения строки файла." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
 КонецПопытки;
   // Показывает на каком этапе импорт, можно сделать в процентах.
   ПоказатьОповещениеПользователя("Обработка файла",,"Строка " + Строка + " из " + ПоследняяСтрока);
 КонецЦикла;

Закроем приложение

ExcelПриложение.Quit();

Примечание

Перед циклом можно очистить таблицу, но пользователь может захотеть за раз загрузить несколько файлов.

Объект.ТабличнаяЧасть.Очистить();

Полный исходный код

&НаКлиенте
Процедура ПолучитьДанные()
  Режим = РежимДиалогаВыбораФайла.Открытие; 
  ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); 
  ДиалогОткрытияФайла.ПолноеИмяФайла = "1"; 
  Фильтр = "Текст(*.xls)|*.xls"; 
  ДиалогОткрытияФайла.Фильтр = Фильтр; 
  ДиалогОткрытияФайла.МножественныйВыбор = Ложь; 
  ДиалогОткрытияФайла.Заголовок = "Выберите файл для импорта"; 

  Если ДиалогОткрытияФайла.Выбрать() Тогда 
    ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
  КонецЕсли;

  Если ПустаяСтрока(ПутьКФайлу) Тогда
    Предупреждение("Импорт прерван, т.к. не выбран файл.");
    Возврат; // прерывание
  КонецЕсли;

  Попытка
    ПоказатьОповещениеПользователя("Импорт",,"Загрузка Microsoft Excel...");
    ExcelПриложение = Новый COMОбъект("Excel.Application");
  Исключение
    Сообщить("Ошибка при загрузке файла." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
    Возврат;
  КонецПопытки;

  Попытка
    ПоказатьОповещениеПользователя("Импорт",,"Открытие файла Microsoft Excel...");
    Файл = ExcelПриложение.WorkBooks.Open(ПутьКФайлу);
  Исключение
    Сообщить("Ошибка открытия файла." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
  КонецПопытки;

  Попытка
    ПоказатьОповещениеПользователя("Обработка",,"Обработка файла Microsoft Excel...");
    Лист = Файл.Sheets(1); // Читаем данные первого листа книги
    // Определить количество строк и колонок выбранного листа книги Excel
    xlCellTypeLastCell = 11;
    ПоследняяСтрока = Лист.Cells.SpecialCells(xlCellTypeLastCell).Row;
    ПоследняяКолонка = Лист.Cells.SpecialCells(xlCellTypeLastCell).Column;
  Исключение
    Сообщить("Ошибка открытия листа 1." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
    ExcelПриложение.Quit();
  КонецПопытки;

  Для Строка = 1 По ПоследняяСтрока Цикл
    ОбработкаПрерыванияПользователя();
    Попытка
      ПроверкаПустота = Лист.Cells(Строка, 1).Value;
      если ПроверкаПустота <> " " тогда 
        Стр = Объект.ТабличнаяЧасть.Добавить();
        Стр.Фамилия = Лист.Cells(Строка, 1).Value;
        Стр.Имя = Лист.Cells(Строка, 2).Value;
        Стр.Отчество = Лист.Cells(Строка, 3).Value;
      конецесли;
    Исключение
      Сообщить("Ошибка чтения строки файла." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
    КонецПопытки;
    ПоказатьОповещениеПользователя("Обработка файла",,"Строка " + Строка + " из " + ПоследняяСтрока);
  КонецЦикла;
  ExcelПриложение.Quit();
КонецПроцедуры


comments powered by Disqus

Популярное