Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

Самая быстрая технология забора данных из большого Excel-файла.   Найти похожие ветки 

 
Vlad Oshin ©   (2007-03-23 14:41) [0]

Какая?

делаю пока
ExcelApp := CreateOleObject("Excel.Application"); и т.д.
- пока все обработается, можно 2 раза чай попить и в перерыве на delphimaster пофлудить, так что помогите, в Ваших же интересах :)


 
Empleado ©   (2007-03-23 14:42) [1]

DDE?


 
Empleado ©   (2007-03-23 14:45) [2]

Кстати:
http://subscribe.ru/archive/comp.soft.prog.delphifaq/200502/27090427.html


 
Сергей М. ©   (2007-03-23 14:49) [3]


> Vlad Oshin ©   (23.03.07 14:41)


Самая быстрая - не трогать Ёхель вообще, ни под какими предлогами)
Т.е. формировать ёхельный документ средствами иными, нежели ёхельными)


 
Rouse_ ©   (2007-03-23 14:51) [4]


> Т.е. формировать ёхельный документ средствами иными, нежели
> ёхельными)

ИМХО умучаться можно пока средства напишеш :)


 
Prohodil Mimo ©   (2007-03-23 14:55) [5]

Rouse_ ©   (23.03.07 14:51) [4]

можно воспользоваться уже готовыми, правда хорошие - платные.


 
Skyle ©   (2007-03-23 14:57) [6]

Я бы копировал Range в массив вариантов.


 
Карелин Артем ©   (2007-03-23 15:05) [7]

Быстрее [6] не удавалось у меня


 
jack128 ©   (2007-03-23 15:06) [8]

Vlad Oshin ©   (23.03.07 14:41)
ExcelApp := CreateOleObject("Excel.Application"); и т.д.


Самое главное в выделенном сидит.


 
sniknik ©   (2007-03-23 15:09) [9]

именно данных... (не формул, не кода, не форматирования, ...)
ADO + Jet. довольно быстро.

и кстати уверен что и способ из [0], можно сделать побыстрее... скажем так, на один чай. (примерно)


 
homm ©   (2007-03-23 15:10) [10]

> именно данных...

Ну если именно данных, то csv можно.


 
umbra ©   (2007-03-23 15:12) [11]

Поддерживаю  [10]


 
sniknik ©   (2007-03-23 15:18) [12]

> Ну если именно данных, то csv можно.
можно, но конвертация в csv это = забор данных из xls и запись в csv, и + еще забор из csv. т.е. как бы быстро из csv не забирало все одно это на 2 операции медленнее прямой выборки.

вот если бы стоял вопрос о быстром заборе из любого подходящего формата файла... то без проблем, время на конвертацию тогда откидывается.


 
Vlad Oshin ©   (2007-03-23 15:35) [13]


> Я бы копировал Range в массив вариантов.

именно так и делается, когда определиться этот ранже
но до этого приходится тупо перебирать по одной ячейке и анализировать что там написано.


> не трогать Ёхель вообще

не получится, сторонняя программка так выкидывает свои данные


> jack128 ©   (23.03.07 15:06) [8]

ну да, пока идет поячеечный анализ..


> именно данных... (не формул, не кода, не форматирования,
>  ...)

нет, в том то и дело..
иногда приходится перейти по гиперссылке на сайт, проверить актуальность
при актуальности, следующий блок данных выдирается также с ссылками
вот такая ерунда, короче..
правда, форматирование не нужно, что уже, хоть немного, радует


 
Паша 1   (2007-03-23 15:43) [14]


> CreateOleObject("Excel.Application");

работает нормально(у меня так). просто надо пользоваться массивами, и писать/читать данные через них. счаз поищу код.


 
umbra ©   (2007-03-23 15:49) [15]


> ну да, пока идет поячеечный анализ..

этого надо избегать. Если у Вас данные как-то группируются гиперссылками, то можно использовать коллекцию Hyperlinks


 
Паша 1   (2007-03-23 15:52) [16]

Vals:= VarArrayCreate([0, число строк, 0, число колонок], varVariant);
потом наполняем массив вариантов
vExcel.Range[vExcel.Cells[2,1], vExcel.Cells[l+1,число колонок]].FormulaR1C1(или FormulaR1C1Local):= Vals;
это мы пишем тудой. секунды

чтение... так навскидку не находицца


 
Паша 1   (2007-03-23 15:54) [17]

FormulaR1C1Local - эта штучка должна давать значение ячейки, а не ссылку. спрбуй, мне лениво


 
jack128 ©   (2007-03-23 15:55) [18]

Vlad Oshin ©   (23.03.07 15:35) [13]
ну да, пока идет поячеечный анализ..


Ну и о чем тогда разговор???  Вообще я бы просто VBA макрос внедрил бы в excel и уже в макросе анализ делал..


 
sniknik ©   (2007-03-23 15:59) [19]

> но до этого приходится тупо перебирать по одной ячейке и анализировать что там написано.
почему тогда не тупо выбрать диапазон, и не перебирать после в массиве?

ексель это такая штука, что обращение к одной ячейке будет примерно равно по времени считыванию со ста (+-...~)
т.е. количество обращений имеет смысл минимизировать, использовать функции работающие с диапазонами.


 
Vlad Oshin ©   (2007-03-23 16:02) [20]


> ну да, пока идет поячеечный анализ..
>
> Ну и о чем тогда разговор???  

ну, вот то есть
первая ячейка - ИмяПартнера + гиперссылка на его сайт
вторая - может быть контактная ин-фа, а может и не быть
третья - название его спец.предложения + ссылка.
надо сходить на сайт, проверить работающее ли еще предложение.
нет - следующий блок(уже не поячеечно), относящийся к этому преждложению, тупо забрать, откидывая ссылки, чтоб юзеры не ходили туда, где рыба уже кончилась
да - тоже самое, но ссылками.

далее ищем поячеечно второго партнера и тоже самое с ним, или же второе предложение от первого может быть.


 
Vlad Oshin ©   (2007-03-23 16:04) [21]


> sniknik ©   (23.03.07 15:59) [19]

аа, если так...


 
Паша 1   (2007-03-23 16:05) [22]

есть эще такая штука, как
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
(выдрано из макроса)
делаем пустой лист, туда специальной вставкой копируем по значению, без ссылок, а потом все уже ясно через массив вариантов анализ. несколько через задницу, правда


 
Сергей М. ©   (2007-03-23 16:15) [23]


> > не трогать Ёхель вообще
>
> не получится, сторонняя программка так выкидывает свои данные


Ну и пусть себе "выкидывает" !

Ёхель-то тут причем ?)


 
Ломброзо ©   (2007-03-23 16:19) [24]

Самый быстрый способ - Range.CopyFromRecordset


 
Vlad Oshin ©   (2007-03-23 16:20) [25]


> Паша 1

да, похоже, много придется периодически смотреть в VBA excel

ps
а полностью VBA ... не знаю.. во-первых я с ним на Вы, во-вторых нужно как можно проще чтоб менеджеру было.
отсюда задумка: юзер получает файл, правой кнопкой по нему тыкает, выбирает в контекстном меню Проводника мой пункт, файл обрабатывается, что куда надо из него выдирается/прописывается.

все, пошел трудится :)
Всем спасибо.


 
Паша 1   (2007-03-23 16:25) [26]


>  похоже, много придется периодически смотреть в VBA excel

а шо там такого военного? я все наработки именно оттудова и подглядывал. и справка там есть. ну, немного непривычный язык, но шоб уж так совсем было непонятно... я ВБА тоже не учил


 
lookin ©   (2007-03-24 05:13) [27]

А я не понял вопроса. Надо чего-то найти и потом скопировать Range? Если попробовать функцию поиска Excel, и копировать с найденной позиции? Хотя я все равно ничего не понял из вопроса...


 
ЮЮ ©   (2007-03-24 08:01) [28]

> [5] Prohodil Mimo ©   (23.03.07 14:55)
> можно воспользоваться уже готовыми, правда хорошие - платные.


Надо было запасаться пока были уже хорошие, но ещё бесплатные и с иcходниками. :)
У меня вот затесался Flexcel v2.5.3 (декабрь 2002). Пользуюсь и не жалуюсь :)


 
Думкин ©   (2007-03-24 08:51) [29]

> lookin ©   (24.03.07 05:13) [27]

Именно.
Потом оказалось, что гвоздь и не в этом.
Дурит парень.


 
kaif ©   (2007-03-24 14:30) [30]

Мои эксперименты показали, что довольно быстрый и удобный способ работы с Excel-файлом - ADO.
 Как-то (пару лет назад) мне необходимо было забирать данные из нескольких сотен Excel-таблиц и перекачивать в серверную базу данных менее чем за час. Каждый файл содержал некоторые общие данные в отдельных ячейках и плоскую таблицу, содержащую около 30 тыс ячеек. Я предварительно с помощью "ExcelApp := CreateOleObject("Excel.Application"); и т.д." брал данные из "вненетабличных" ячеек, упрощал каждый файл (обрезал все лишние ячейки, оставляя лишь плоскую таблицу), затем сохранял результат во временном Excel-файле и тут же обращался к нему через ADO. В результате удалось сделать импорт нескольких миллионов ячеек (в InterBase) меньше чем за час на не самом быстром компьютере.


 
Gydvin ©   (2007-03-24 15:19) [31]


> Самая быстрая технология забора данных

С холодным и/или огнестрельным оружием )))


 
Vlad Oshin ©   (2007-03-26 13:14) [32]

да бог с ним, что дурю

а подскажите, как гиперссылки забрать?

 Cell1 := WorkBook.WorkSheets[1].Cells[x, y];
   Cell2 := WorkBook.WorkSheets[1].Cells[x1, y1];
   Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];

 HyperLink:= Range.Hyperlinks.Count; - показывает сколько гиперссылок там
 showmessage(HyperLink);

пытаюсь хоть одну забрать - ошибка,
Член группы не найден

//  HyperLink:= string(Range.Hyperlinks.item(1).adress); // хоть как
 HyperLink:= string(Range.Hyperlinks.item[1].adress); // хоть как, без разницы
 showmessage(HyperLink);


однако в VBA в самом екселе следующее
a = Range("U13:U200").Hyperlinks.Item(1).Address
MsgBox (a)

показывает мессадж со ссылкой

Почитал на КД про перенос макросов - не понял. По моему, я делаю тоже самое, но у меня что-то не выходит.

как достучаться до массива ссылок?


 
umbra ©   (2007-03-26 13:26) [33]


> adress

и

> Address

несколько отличаются :)


 
Паша 1   (2007-03-26 13:26) [34]


> как гиперссылки забрать

а шо именно имееца в виду? шо за массивы гиперссылок такие?
у ехеля есть такая штука: в ячейке сидит формула, например суммы ячеек, а отображает он уже ее результат. так тебе формулы надо(Range.FormulaR1C1Local), или результат расчета, который мы видим глазками(Range.Value)?


 
umbra ©   (2007-03-26 13:31) [35]


> string(Range.Hyperlinks.item[1].adress)

кстати, приводить к string необязательно, это ж вариант, сам приведется :)


 
Паша 1   (2007-03-26 13:32) [36]


>  WorkBook.WorkSheets[1].Range[Cell1, Cell2]

вообще нифига непонятно. с какого бодуна ты вместо координат Х, Y подсовываешь Cell1, Cell2? брррр...


 
Vlad Oshin ©   (2007-03-26 13:53) [37]


> WorkBook.WorkSheets[1].Range[Cell1, Cell2]
>
> вообще нифига непонятно. с какого бодуна ты вместо координат
> Х, Y подсовываешь Cell1, Cell2? брррр...

так было в примере , и так работало всегда у меня


> > adress
>
> и
>
> > Address
>
> несколько отличаются :)


ну да, это я просто обшибся, ну сути это не меняет:
Член группы не найден
все равно.


> шо за массивы гиперссылок такие?

range.Hyperlinks - там все ссылки, к ним можно обращаться по индексу
item(i).name
item(i).address
item(i).subaddress если вторая ссылка есть
item(i).то_что отображается
item(i).то_что по хинту выскакивает
В VBA, по крайней мерее


> Range.FormulaR1C1Local

не то совершенно дает, вместо ссылки в инет показывает ересь какую-то


 
Vlad Oshin ©   (2007-03-26 14:01) [38]

так попробовал:
   Range := WorkBook.WorkSheets[1].Range["U13", "U200"];
 HyperLink:= Range.Hyperlinks.Count;
 showmessage(HyperLink); // мессадж "76"
 HyperLink:= Range.Hyperlinks.item(1).Address; // - Член группы не найден
 showmessage(HyperLink);

VBA:
a = Range("U13:U200").Hyperlinks.Item(1).Address
MsgBox (a)

все нормально, мессадж с адрессом


 
Паша 1   (2007-03-26 14:01) [39]


> и так работало всегда у меня

странно... судя по тому, шо ты написал, Cell1 := WorkBook.WorkSheets[1].Cells[x, y] - это у тебя объект. как его вместо координат подставлять можно?


> вместо ссылки в инет показывает ересь какую-то

я с гипперссылками не работал, мне формулы надо были. собственно, даже не формулы, а шоб при копировании через массив вариантов реальное содержимое не портилось. шо там сидит на самом деле не проверял, если честно.


 
Паша 1   (2007-03-26 14:04) [40]

дык... ВБА не всегда дает нужный код. попробуй заменить на квадратные скобки
Range.Hyperlinks.item[1].Address

судя по всему, это массив



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.045 c
2-1175119886
ppcumax
2007-03-29 02:11
2007.04.22
Как перемешать слова в Memo


2-1175339458
Ezorcist
2007-03-31 15:10
2007.04.22
Как послать форме message и отреагировать на него?


15-1174838996
Чувак
2007-03-25 20:09
2007.04.22
Вопрос по ошибке железа


2-1175192929
aleko
2007-03-29 22:28
2007.04.22
ReadBuffer & WriteBuffer


15-1175207940
рожке
2007-03-30 02:39
2007.04.22
intel d945 plrn не выключается





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский