Ускорение работы с Excel через OLE?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

Сообщение lexa »

Столкнулся тоже с этой проблемой.
Необходимо постоянно в TPS-ном файле(длина записи 420 байт) постоянно обновлять около ста пятидесяти тысяч строк при импорте из Excel (из сформированного обобщенного прайс-листа).
Попытался использовать предлагаемые решения. Все равно очень долго.
В начале темы прозвучало, на мой взгляд, решение выхода из этой ситуации - работа через ClipBoard.
Вопрос, опять на мой взгляд, не из простых, а для кого-то уже пройденный - а как можно работать напрямую с оперативкой, куда помещен ClipBoard всей таблицы. Каков формат этого куска памяти?
Заранее благодарен за совет.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8032
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Сообщение Игорь Столяров »

Мда ! 150 000 * 420 дает на вскидку около 60 MByte.

Даже если сделать аресацию такой строки - все равно к ней доступ будет последовательным и потребуется загрузка в ClipBoard такого массива данных. Может быть проще разместить данные из XLS таблицы последовательным чтением в виде индексированной QUEUE ?
И далее уже с ней работать ?

А если таблица XLS имеет линейную структуру - то можно вместо "медленного" OLE попробовать ODBC драйвер ...
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сообщение Yufil »

lexa писал(а):Столкнулся тоже с этой проблемой.
Необходимо постоянно в TPS-ном файле(длина записи 420 байт) постоянно обновлять около ста пятидесяти тысяч строк при импорте из Excel (из сформированного обобщенного прайс-листа).
Попытался использовать предлагаемые решения. Все равно очень долго.
В начале темы прозвучало, на мой взгляд, решение выхода из этой ситуации - работа через ClipBoard.
Вопрос, опять на мой взгляд, не из простых, а для кого-то уже пройденный - а как можно работать напрямую с оперативкой, куда помещен ClipBoard всей таблицы. Каков формат этого куска памяти?
Заранее благодарен за совет.
Буфер обмена состоит из строк, разделённых символами переноса строки <13,10>
Строка состоит из полей в текстовом виде, разделенных знаком табуляции <9>
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Сообщение lsgsoftware »

Я много раз делал так: выгружал эксельную таблицу в текстовый файла и скармливал его клаше. Работало как часы, а объемы были существенно поболее.Попробуй, может это тебя устроит
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

Сообщение lexa »

Yufil писал(а):Буфер обмена состоит из строк, разделённых символами переноса строки <13>
Строка состоит из полей в текстовом виде, разделенных знаком табуляции <9>
Спасибо. Это то, что нужно.
Да!, просто для решения этой проблемы мне понадобились функция CLIPBOARD(1), переменная String максимальной длины и функции обработки строки по поиску в ней вышеупомянутых кодов разделителей.
Экспериментировал на не очень быстрой машинке с таблицей в 15тыс. строк. Считывание по каждой ячейке и последующей записи на диск занимало примерно 14 мин. Через закачку в String содержимого CLIPBOARD-а, последующей обработки и записи это заняло всего 4-5сек.
Более объемные таблицы через туже процедуру буду загружать частями, думаю, выигрыш будет тот же.
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

Сообщение lexa »

Извиняюсь за неточность – не 4-5сек., а около 2мин. Но это с использованием add(file). Использование append+build снизило длительность всего процесса до 20-22сек. Все равно выигрыш ощутимый.
Ответить