![]() |
|
Загрузка из 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
|
Спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |