Форум: "Прочее";
Текущий архив: 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