Загрузка данных из файла Excel

Обсуждаем вопросы посвященные интеграции с другими информационными системами

Загрузка данных из файла Excel

Сообщение julyp » Пн янв 10, 2011 12:59 am

Приводим код-заготовку для загрузки данных из файла Microsoft Excel.
Надеемся, что материал для Вас будет полезен.


Код: Выделить всё
Процедура ЗагрузитьИзXLS()
   
   ИмяФайла = "H:\project.xls";
   ЛистДанных = 1;
   
   // Получаем лист данных
   
   ОбъектExcelApplication    = Новый COMОбъект("Excel.Application"); 
   ТекущаяКнига          = ОбъектExcelApplication.Application.Workbooks.Open(ИмяФайла);
   ТекущийЛист          = ТекущаяКнига.WorkSheets(ЛистДанных);
   
   // Определяем количество строк в листе
   КоличествоСтрок       = ТекущийЛист.UsedRange.Rows;
   
   Если ЛистДанных > 0 Тогда
      Если КоличествоСтрок > 0 Тогда
         НачатьТранзакцию();
         
         // Удаление информации
         // ...

         
         //--   Чтение информации
         Для Ном = 1 По КоличествоСтрок Цикл
            
            ОбработкаПрерыванияПользователя();
            Состояние("Обработка стр." + Ном + " из "+КоличествоСтрок);
            
            // Загрузка значений текущей строки                        
            Значение1    = СокрЛП(ТекущийЛист.Cells(Ном, 1).Value);
            
            // Обработка значений текущей строки
            
            // ...
         КонецЦикла;
         
         ЗафиксироватьТранзакцию();
      Иначе
         Сообщить("Нет данных");
      КонецЕсли;   
   Иначе
      Сообщить("Не найден лист");
   КонецЕсли;   
   
   //Завершаем работу с Excel
   ОбъектExcelApplication.Application.Quit();

КонецПроцедуры

julyp
Администратор
 
Сообщения: 127
Зарегистрирован: Вт май 25, 2010 6:55 am

Re: Загрузка данных из файла Excel

Сообщение Администратор » Вс апр 17, 2011 9:53 pm

В продолжении темы выкладываем усовершенствованную обработку загрузки из xls в таблицу значений

Код: Выделить всё
   ДиалогВыбораФайла                        =   Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогВыбораФайла.Фильтр                  =   "Файл Excel 2003 (xls)|*.xls|Файл Excel 2007 (xlsx)|*.xlsx";
   ДиалогВыбораФайла.Заголовок                  =   "Выберите файл";
   ДиалогВыбораФайла.ПредварительныйПросмотр      =   Ложь;
   ДиалогВыбораФайла.Расширение               =   "xls";
   ДиалогВыбораФайла.ИндексФильтра               =   0;
   ДиалогВыбораФайла.ПолноеИмяФайла            =   "";
   ДиалогВыбораФайла.ПроверятьСуществованиеФайла   =   Истина;
   
   ИмяФайла = "";
   
   Если ДиалогВыбораФайла.Выбрать() Тогда
      ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
   КонецЕсли;
   
   Если  ЗначениеЗаполнено(ИмяФайла) Тогда
      
      //--   Получение настроек
      ЛистДанных = 1;
      НачальныйНомерСтроки = 2;
      
      //--   Получение листа данных   
      ОбъектExcelApplication    = Новый COMОбъект("Excel.Application"); 
      ТекущаяКнига          = ОбъектExcelApplication.Application.Workbooks.Open(ИмяФайла);
      ТекущийЛист          = ТекущаяКнига.WorkSheets(ЛистДанных);
      
      //--   Определяем количество строк в листе
      КоличествоСтрок       = ТекущийЛист.UsedRange.Rows.Count;
      
      Если ЛистДанных > 0 Тогда
         Если КоличествоСтрок > 1 Тогда
            //--   Транзакция начата
            НачатьТранзакцию();
            
            //--   Удаление данных
            ТаблицаПодразделений.Очистить();
            
            //--   Определение параметров перед началом чтения строк
            КоличествоКолонок = ТаблицаПодразделений.Колонки.Количество();
            ТекущаяОбрабатываемаяСтрока = 0;
            
            //--   Чтение информации
            Для Ном = НачальныйНомерСтроки По КоличествоСтрок Цикл
               
               ОбработкаПрерыванияПользователя();
               
               ТекущаяОбрабатываемаяСтрока = Ном;
               Состояние("Обработка строки " + ТекущаяОбрабатываемаяСтрока + " из " + КоличествоСтрок);
               
               НоваяСтрока = ТаблицаПодразделений.Добавить();
               
               Для ПорядковыйНомерКолонки = 0 По КоличествоКолонок - 1 Цикл
                  НоваяСтрока[ПорядковыйНомерКолонки] = ТекущийЛист.Cells(Ном, ПорядковыйНомерКолонки + 1).Value;
               КонецЦикла;
               
               // ...
            КонецЦикла;
            
            Если ТекущаяОбрабатываемаяСтрока < КоличествоСтрок Тогда
               // Не все строки были обработаны - очищаем таблицу
               
               ТаблицаПодразделений.Очистить();
            Иначе
               ОбработатьЗагруженнуюТаблицу(ТаблицаПодразделений);
            КонецЕсли;
            
            ЗафиксироватьТранзакцию();
            
            //--   Транзакция закончена
         Иначе
            Сообщить("Нет данных");
         КонецЕсли;   
      Иначе
         Сообщить("Не найден лист");
      КонецЕсли;   
      
      //--   Завершаем работу с Excel
      ОбъектExcelApplication.Application.Quit();
      
      Если ТаблицаПодразделений > 0 Тогда
         // Выполнение обработки после загрузки данных
         
      КонецЕсли;
      
   КонецЕсли;
Администратор
Администратор
 
Сообщения: 24
Зарегистрирован: Чт мар 05, 2009 3:23 pm

Re: Загрузка данных из файла Excel

Сообщение julyp » Ср авг 17, 2011 9:15 pm

Иногда при загрузке чисел возникает проблема с дробной частью - выкладываю рецепт

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

//
Функция      СдвинутьПорядокЧислаВправо(Знач Число, Порядок) Экспорт
   
   Для н = 1 По Порядок Цикл
      Число = Число * 0.1;
   КонецЦикла;
   
   Возврат Число;
   
КонецФункции
julyp
Администратор
 
Сообщения: 127
Зарегистрирован: Вт май 25, 2010 6:55 am


Вернуться в Интеграция

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron