Имя: Пароль:
1C
1С v8
Загрузка из Excel объемных данных
0 Zixxx
 
03.09.11
13:24
Поставщики автозапчастей присылают файлы в формате *.xls, которые необходимо постоянно грузить в базу, файлы по сотни тысячь строк, сейчас 99% времени занимает получение данных из ячейки "Страница.Cells(ин, СтрокаДанных.Колонка).Value", как вариант можно преобразовывать в dbf или грузить из текста с разделителями.

Что еще посоветуете, как оптимизировать загрузку, как сделать ее максимально быстрой?
1 andrewks
 
03.09.11
13:24
ёксель?
2 VitGun
 
03.09.11
13:25
(0) код загрузки в студию. ну и версию MS Office.
3 Zixxx
 
03.09.11
13:31
(1) Ага
(2) 2007, Да код обычный как и всегда, просто например 200 тысячь строк * 10 колонок = 2 млн. раз выполняеться кусок кода типа этого:
Значение = Страница.Cells(инСтрока, инКолонка).Value
Ну и как бы времени дохрена уходит на это дела, все это разгребаеться на клиенте в УФ но дело не в этом.
4 Zixxx
 
03.09.11
13:34
// Инициализация
   Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
       
       Попытка
           Excel = Новый COMОбъект("Excel.Application");
       Исключение
           Сообщить("Не удалось инициализировать Excel");
       КонецПопытки;
   
       Excel.Workbooks.Open(СокрЛП(ПутьКФайлу));
       РабочаяКнига    = Excel.ActiveWorkbook;
       Страница        = РабочаяКнига.Worksheets(1);
       
   КонецЕсли;

// Получение значений строки
   ПоследняяСтрока = Страница.Cells(1,1).SpecialCells(11).Row;
   Для ин = НомерПервойСтроки По ПоследняяСтрока Цикл
       
       Структура = Новый Структура;
       Структура.Вставить("Ссылка");
       Для Каждого СтрокаДанных Из КолонкиДанных Цикл
           Если СтрокаДанных.Использовать Тогда
               Структура.Вставить(СтрокаДанных.Данные, ?(СтрокаДанных.Использовать, Страница.Cells(ин, СтрокаДанных.Колонка).Value, Неопределено));
           КонецЕсли;
       КонецЦикла;
       
       НоваяСтрока = ТЗДанныхИзExcel.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока, Структура);

   КонецЦикла;
5 andrewks
 
03.09.11
13:35
(3) 1. чего ага? я говорю, Yoksel пробовал? ему даже установленный офис не нужен
6 Zixxx
 
03.09.11
13:36
(5) А, ну не так понял, нет не пробовал сейчас посмотрю что это такое
7 andrewks
 
03.09.11
13:38
8 DmitrO
 
03.09.11
13:38
вообше говоря данные из ячеек можно получать/устанавливать сразу диапазонами (см. метод Range) в SafeArray. Говорят что гораздо эффективнее получается.

Я бы еще попробовал ODBC драйвер использовать. Имхо самый эффективный способ должен быть, но разметку, шрифты, цвета и т.п. шнягу уже не прочитаешь через него.
9 Zixxx
 
03.09.11
13:40
(7) А на Linux будет работать, там же регить нужно?
10 Zixxx
 
03.09.11
13:40
(8) Через ODBC нет примера?
11 andrewks
 
03.09.11
13:43
(9) а щас у тебя мс офис на линукс?
12 DmitrO
 
03.09.11
14:20
(10) данивапрос
   //для данного драйвера первая строка на листе Excel это имена колонок
   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.Open("Driver={Microsoft Excel Driver (*.xls)};Dbq=C:\MyFile.xls;");
   Recordset = Connection.Execute("SELECT [Номер],[Значение] FROM [Лист1$]");
   FieldНомер = Recordset.Fields("Номер");
   FieldЗначение = Recordset.Fields("Значение");
   Пока не Recordset.EOF Цикл
       Сообщить(""+FieldНомер.Value+" - "+FieldЗначение.Value);
       Recordset.MoveNext();
   КонецЦикла;
13 Zixxx
 
03.09.11
16:07
Спасибо
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.