Главная страница
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

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


 
Vlad Oshin ©   (2007-03-26 14:07) [41]


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

там вариант просят, ну так и даем вариант
ранж - с ячейки такой по такую, все логично


 
Vlad Oshin ©   (2007-03-26 14:10) [42]

ты прав.
черт...
когда раньше пробовал [] - была ошибка в address
теперь заработало, наконец..

и изза этого блин пол-дня..
спасибо.


 
Паша 1   (2007-03-26 14:10) [43]


> там вариант просят

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


 
Vlad Oshin ©   (2007-03-27 11:18) [44]

где парень дурит?
это..
проблема не снята - могу забрать сразу все Значения
Могу забрать сразу все Ссылки
достаточно быстро получается

А если где-то в середине нет у значения сылки?
как забрать все, значения+все остальное? (ссылки, в частности)


 
umbra ©   (2007-03-27 11:30) [45]


> как забрать все, значения+все остальное?

т.е. данные у Вас расположены примерно так:

строка1 - ИмяПартнера1+гиперссылка
строка2 - Данные партнера1+возможно гиперссылка
строка3 - спецпредложение1+гиперссылка
строки 4-х - некий набор данных, относящийся к партнеру1
строка х+1 - ИмяПартнера2+гиперссылка
и т.д

Правильно я понял?


 
Vlad Oshin ©   (2007-03-27 11:41) [46]

да, правильно

очень большой кусок данных
партнер + может быть гиперссылка, ...

надо забрать как-бы в 2 матрицы - матрица значений и СООТВЕТСТВУЮЩАЯ матрица гиперссылок


 
umbra ©   (2007-03-27 12:34) [47]

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

> строка1 - ИмяПартнера1+гиперссылка

то можно
1) взять все гиперссылки с листа (Worksheet[1].Cells.Hyperlinks)
2) отсортировать их по возрастанию свойства Hyprelinks.Item[i].Range.Row.  
  Теперь они идут в порядке следования на листе.
3) начинаем их перебирать в цикле. Определив, что текущая гиперссылка относится к первой строке блока (это можно сделать по разнице значений св-ва Hyprelinks.Item[i].Range.Row) можно проверить спецпредложение (ссылка на которое находится на третьей строке блока) и затем скопировать диапазон строк от текущей до строки Hyprelinks.Item[i + х].Range.Row - 1

х определяем исходя из того, что Item[i + х] находится далеко от текущей (скажем, дальше чем в 3 строках


 
Vlad Oshin ©   (2007-03-27 15:03) [48]

непонял


> 1) взять все гиперссылки с листа (Worksheet[1].Cells.Hyperlinks)

ага


> 2) отсортировать их по возрастанию свойства Hyprelinks.Item[i].
> Range.Row.  
>   Теперь они идут в порядке следования на листе.

ага


> 3) начинаем их перебирать в цикле.

ага
дальше не понял.

Отвлечемся, если у Вас есть время или Вам его не очень жалко.
Есть массив1, есть массив2
массивы одинаковы в размерах

элементы массив1 могут быть пусты (редко)
элементы массив2 могут быть пусты (достаточно часто)

элементы массив2 могут быть пусты, даже если соотв. элементы массив1 не пусты

Задача:
получить четкое соответствие m1[i,j]-m2[i,j]
m1[n1,m1]="aaaaaa"
m2[n1,m1]="www.microsoft.com"

m1[n2,m2]="bbbbbb"
m2[n2,m2]="www.macrosoft.com"

m1[n3,m3]="cccccc"
m2[n3,m3]=""

m1[n4,m4]=""
m2[n4,m4]=""

m1[n5,m5]="poiuyt"
m2[n5,m5]="www.qwertsoft.com"
....

что-то кроме поячеячного все равно ничего не вижу


 
Vlad Oshin ©   (2007-03-27 15:13) [49]

даже нет
не равны же массивы 1 и 2 получается

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


 
umbra ©   (2007-03-27 15:17) [50]

если начала (или концы) блоков не выделены как-то, то, конечно, - только поячеечно. Но разговор для экселя слишком абстрактный :) Вы имеете в виду, что массив1 - это имена партнеров, массив2 - соответствующие ссылки?


 
umbra ©   (2007-03-27 15:21) [51]

сколько ячеек в строке занимают доп данные?


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

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


 
Vlad Oshin ©   (2007-03-27 15:29) [53]


> Вы имеете в виду, что массив1 - это имена партнеров, массив2
> - соответствующие ссылки?

именно


> сколько ячеек в строке занимают доп данные?

не принципиально, все равно придется брать иногда поячеячно, имхо
несколько раз поячеячно, для определения блока, потом м/б range

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


 
umbra ©   (2007-03-27 15:57) [54]


> не принципиально,

почему же. если например, они занимают 5 столбцов, а заголовки - 3, то можно легко вычислить заголовки, поискав на листе пустые ячейки в 4-м или 5-м столбце, причем не обращаясь к каждой ячейке, а с помощью экселевского же метода Find


 
Vlad Oshin ©   (2007-03-27 16:27) [55]


> > не принципиально,
>
> почему же.

да просто утверждаю,
> все равно придется брать иногда поячеячно

задача та же

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

например, кусок файла
   

1608 1833 2028 2096 2372 2620
1770 2085 2352 2296 2688 3020
1557 1857 2109 2144 2612 3004
1572 1833 - 2068 2400 -
1668 1986 -2300 2228 2656 -
2091 2649 3099 2688 3380 3936
2007 2517 2931 2592 3232 3744
 
-     совсем нет ничего
-Х   Х, но ссылки нет
Х    Х и ссылка


 
umbra ©   (2007-03-27 16:36) [56]


> например, кусок файла
>    

а где же хоть один Х? :)
и сколько ячеек в строке занимает Х со ссылкой?



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

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.435 c
15-1175114591
ProgRAMmer Dimonych
2007-03-29 00:43
2007.04.22
Посоветуйте, как перевести...


2-1175316917
Roman_S
2007-03-31 08:55
2007.04.22
Складной? Label


2-1175627383
likenoother
2007-04-03 23:09
2007.04.22
дурацкий вопрос


3-1170513670
Itonix
2007-02-03 17:41
2007.04.22
Разница в компонентах


15-1174690671
eXPell
2007-03-24 01:57
2007.04.22
Ну, разве что для интереса)))