Текущий архив: 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