Имя: Пароль:
1C
 
как загрузить данные из excel'я в таблицу значений?
0 фросия
 
04.06.10
15:21
мне надо маленький шаблончик:
открыть эксель,
открыть нужный лист,
получить значение ячеечки(строка, столбец)
помогите пожалуйста?
1 Чайник Рассела
 
04.06.10
15:23
// Обработчик события НачалоВыбора элемента ПутьКФайлу.
//
Процедура ПутьКФайлуExcelНачалоВыбора(Элемент, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Заголовок = "Выберите файл";
   Диалог.ПолноеИмяФайла = "c:\";
   Диалог.Фильтр = "Книга Excel 97-2003 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx";
   
   Если Диалог.Выбрать() Тогда
       
           ПутьКФайлу = Диалог.ПолноеИмяФайла;
   
       
   КонецЕсли;
   
КонецПроцедуры
2 Just4Fun
 
04.06.10
15:23
Функция ПрочитатьФайлЭксель(ПутьКФайлу) Экспорт
   
   //Создание объекта для установки связи с источником данных
   Connection = Новый COMОбъект("ADODB.Connection");
   //сформируем строку подключения
   //Если необходимо в дальнейшем оперировать цифровыми значениями колонок,то ставим признак HDR = NO
   //если необходимо производить загрузку с учетом псевдонимов в 1й строке,то ставим HDR = YES
   СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+ПутьКФайлу;
   СтрокаПодключения = СтрокаПодключения + "; Extended Properties = "+"""Excel 8.0"+";HDR=NO;IMEX=1"";";
   //подключение к источнику данных
   Попытка
       Connection.Open(СтрокаПодключения);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат Неопределено;
   КонецПопытки;    
   
   //создание объекта выполнения команды
   Command = Новый COMОбъект("ADODB.Command");
   //создание объекта подключения к файлу
   axCatalog = Новый COMОбъект("ADOX.Catalog");
   axCatalog.ActiveConnection = Connection;
   //получим листы документа,
   //для обработки колонок листа можно обратится к коллекции Лист.Columns,которую тоже можно обойти посредством цикла Для каждого

   СписокЛистов = Новый СписокЗначений;
   КоличествоКолонок = 0;
   Для каждого Лист ИЗ axCatalog.Tables Цикл
       
       ТекстЗапросаКолонки = "";
       Если Лист.Columns.Count() > 5 Тогда
           Для к = 1 По Лист.Columns.Count() Цикл
               ТекстЗапросаКолонки = ТекстЗапросаКолонки + ?(ТекстЗапросаКолонки="","F"+Формат(к,"ЧЦ=15; ЧГ=0"),",F"+Формат(к,"ЧЦ=15; ЧГ=0"));    
           КонецЦикла;
           СписокЛистов.Добавить(Лист.Name,ТекстЗапросаКолонки);
           КоличествоКолонок = к - 1;
           Прервать;
       КонецЕсли;
       
   КонецЦикла;
   
   
   //Создание объекта набора записей
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   //Указание активного соединения
   Command.ActiveConnection = Connection;
   //получим количество строк в документе
   Command.CommandText = "SELECT COUNT(*)FROM ["+СписокЛистов[0].Значение+"]";
   //определение типа команды
   Command.CommandType = 1;
   //Выполнение и получение набора данных
   RecordSet = Command.Execute();
   //первая запись это количество
   КоличествоСтрок = RecordSet.Fields(0).Value;
   //опредлеление текста команды
   Command.CommandText = "SELECT "+СписокЛистов[0].Представление+" FROM ["+СписокЛистов[0].Значение+"]";
   //определение типа команды
   Command.CommandType = 1;
   
   //Выполнение и получение набора данных
   Попытка
       RecordSet = Command.Execute();
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
   МассивТипов = Новый Массив;
   МассивТипов.Добавить(Тип("Дата"));
   МассивТипов.Добавить(Тип("Строка"));
   МассивТипов.Добавить(Тип("Число"));
   МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
   
   ОписаниеТипов = Новый ОписаниеТипов(МассивТипов,Новый КвалификаторыЧисла(15,2),Новый КвалификаторыСтроки(100),Новый КвалификаторыДаты(ЧастиДаты.Дата));
   
   ТаблицаЗагрузки = Новый ТаблицаЗначений;
   Колонки = ТаблицаЗагрузки.Колонки;
   Для к = 1 По КоличествоКолонок Цикл
       Колонки.Добавить("F" + Формат(к,"ЧЦ=15; ЧГ=0"),ОписаниеТипов);
   КонецЦикла;
   
   RecordSet.MoveNext();//т.к первая строка это заголовки таблиц,не будем ее учитывать
   Пока RecordSet.EOF() = 0 Цикл
       НоваяСтрока = ТаблицаЗагрузки.Добавить();
       к = 0;
       Для каждого Колонка ИЗ ТаблицаЗагрузки.Колонки Цикл
           НоваяСтрока[Колонка.Имя] = СокрЛП(Строка(RecordSet.Fields(к).Value));
           к = к+1;
       КонецЦикла;
       RecordSet.MoveNext();
   КонецЦикла;
   
   //Колонки.Добавить("Нпп" ,Новый ОписаниеТипов("Дата,Строка,Число",Новый КвалификаторыЧисла(15),Новый КвалификаторыСтроки(100),Новый КвалификаторыДаты(ЧастиДаты.Дата)));
   
   Возврат ТаблицаЗагрузки;
   
   RecordSet.Close();    
   
   Connection.Close();
   
КонецФункции
3 FIXXXL
 
04.06.10
15:24
Функция ПрочитатьВТаблицуЗначений(Файл)

   Excel = Новый ComОбъект("Excel.Application");
   Excel.Workbooks.Open(ФайлXML);
   Excel.DisplayAlerts = 0; //Не выводить предупреждения Excel
   
   ТЗ = Новый ТаблицаЗначений;
   Для ии = 1 По Excel.Cells.SpecialCells(11).Column Цикл
       
       Попытка
           Если ии < 10 Тогда
               ТЗ.Колонки.Добавить("Кол00"+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           Иначе
               ТЗ.Колонки.Добавить("Кол0"+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           КонецЕсли;
       Исключение
           //Если ии < 10 Тогда
           //    ТЗ.Колонки.Добавить("Кол00"+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           //Иначе
           //    ТЗ.Колонки.Добавить("Кол0"+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           //КонецЕсли;
           Сообщить("Не удалось добавить колонку");
       КонецПопытки;
       
   КонецЦикла;
       
   КолКолонок = ии - 1;
   
   КоличествоСтрок = Excel.Cells.SpecialCells(11).Row;
   
   Если НомерНачальнойСтроки < 1 Тогда
       НомерНачальнойСтроки = 1
   КонецЕсли;
   
   //Для ии = 2 По КоличествоСтрок  Цикл    
   Для ии = НомерНачальнойСтроки По КоличествоСтрок  Цикл
       стр = ТЗ.Добавить();
       Для кол = 1 По КолКолонок Цикл
           стр[кол-1] = Excel.ActiveSheet.Cells(ии,кол).Value;
       КонецЦикла;
       Состояние("Загружено из XLS: "+Строка(ии)+ " из "+Строка(КоличествоСтрок));
   КонецЦикла;
   
   Excel.Quit();

   Возврат ТЗ;
   
КонецФункции // ПрочитатьВТаблицуЗначений()
4 фросия
 
04.06.10
15:25
(3) а где номер листа указывается?
5 фросия
 
04.06.10
15:27
(2) спасибо, но мне надо попроще.
6 FIXXXL
 
04.06.10
15:27
(4) да мне без листов всегда хватало
7 Just4Fun
 
04.06.10
15:27
(5)пардоньте
8 фросия
 
04.06.10
15:30
(6) ок, тогда попробую скопировать с разных листов в разные файлы.
ActiveSheet  - это наверное указывает на то что берутся данные с активного листа?
9 notton
 
04.06.10
15:31
(0)(8) бабы как всегда бабы) непонятно только зачем этим заниматься тогда
10 фросия
 
04.06.10
15:36
(9) знать ВСЁ невозможно. достаточно знать где можно посмотреть/у кого спросить.
ну нет у меня под рукой ни одной обработки в которой данные из экселя берутся.
то что нашла поиском - не работает.
11 DmiVo
 
04.06.10
15:36
(8)Может ActiveSheet заменить на Sheets(НомерЛиста)?
12 notton
 
04.06.10
15:39
(10) логику вы тоже на аутсорс отдали?
13 Maxus43
 
04.06.10
15:45
ещё вариант

Док = ПолучитьCOMОбъект(Путь + "ценыконкурентов.xls");
КоличествоСтраниц = 2;

Для ТекНомер = 1 По КоличествоСтраниц Цикл
   Контрагент = Док.Sheets(ТекНомер).Cells(1,1).Value;
   Товар       = Док.Sheets(ТекНомер).Cells(2,2).Value;
   Цена       = Док.Sheets(ТекНомер).Cells(2,3).Value;

   счСтроки = 3;
   Сообщить(Строка(Товар) + "-" + Строка(Цена));

   Пока СокрЛП(Товар) <> "" Цикл    // можно использовать другой признак
                                    // окончания данных на листе
       Товар = Док.Sheets(ТекНомер).Cells(СчСтроки,2).Value;
       Цена  = Док.Sheets(ТекНомер).Cells(СчСтроки,3).Value;

       Сообщить(Строка(Товар) + "-" + Строка(Цена));
       
       счСтроки = счСтроки + 1;
       
   КонецЦикла;

КонецЦикла;    

Док.Application.Quit();
14 Skylark
 
04.06.10
15:48
Excel = Новый COMОбъект("Excel.Application");
НашФайл = Excel.Workbooks.Open(СокрЛП(ПолеВводаИмяФайла));
НашЛист = НашФайл.Sheets(ПолеВводаНомерЛиста);
Если ПолеВводаНомерПоследнейстрокиДанных = 0 Тогда
 ПоследняяСтрока = Excel.Cells(1,1).SpecialCells(11).Row;
Иначе
 ПоследняяСтрока = ПолеВводаНомерПоследнейстрокиДанных;
КонецЕсли;    

Для i = ПолеВводаНомерПервойСтроки По ПоследняяСтрока Цикл
 Состояние("Загрузка строки " + i);
 // чтение данных из файла
 Наименование = НашЛист.Cells(i, 1).Value;
КонецЦикла;
Независимо от того, куда вы едете — это в гору и против ветра!