Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Самая быстрая технология забора данных из большого 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.033 c
15-1174819383
Логин
2007-03-25 14:43
2007.04.22
Реклама на сайте


2-1175666969
s.k
2007-04-04 10:09
2007.04.22
запуск приложения


2-1175561133
SerJaNT
2007-04-03 04:45
2007.04.22
Присвоить событию свою процедуру


15-1174749101
Kolan
2007-03-24 18:11
2007.04.22
Опрос: Какой синтаксис поисковах запросов вы бы использовали?


2-1175596683
Steep
2007-04-03 14:38
2007.04.22
Real Time Панель