zja |
Отправлено: 23.05.2003, 17:47 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 11
|
нада: передать массив 20 на 200000 строк в Excel97
проблема: при передаче некоторого количества информации все виснет
попытки: пробовал и через ExcelApplication и через OLE — проблема остается, с той лишь разницей , что в общем случае через OLE проходит примерно в 1,5-3 раза больше информации до момента зависания и процесс компиляции решения на OLE в 100 раз быстрее, чем через компоненты.(ИМХО не юзайте их вовсе для Excel97 — оно того вообще не стоит).
Читал статьи на google.com.ru по группе *cppbuilder* и по другим, *borland* например, есть мнение, что где-то происходит утечка памяти, (точнее при Variant(переменная)). Может кто подскажет как с этим бороться?
Почитаю еще местный архив, но заранее боюсь разочароваться.
Короче помогите кто сможет, буду очень признателен. |
|
Admin |
Отправлено: 24.05.2003, 04:50 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Похожий вопрос был на старом форуме
"Экспорт в Excel очень большой таблицы.
Воспользуйтесь компонентами
XLSReadWrite 2
|
|
большое спасибо |
Отправлено: 24.05.2003, 12:08 |
|
Не зарегистрирован
|
subj, я был уверен, что кто-нибудь у же сталкивался с подобными задачами |
|
zja |
Отправлено: 27.05.2003, 12:46 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 11
|
принципиально работает, но очень медленно, а может это из-за связанных таблиц... не знаю |
|
zja |
Отправлено: 30.05.2003, 18:38 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 11
|
короче я это сделал: 200000 строк из доисторической бд в Excel97 с разбивкой по листам, кому через 1E6 лет вдруг потребуется стучите, большое спасибо Admin за качественный хелп |
|
Admin |
Отправлено: 30.05.2003, 19:19 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Судя по информации со всех больших форумов по
C++Builder и Delphi компоненты XLSReadWrite II самые быстрые:
QUOTE |
"XLSRead Write v.1.35
Автор Ларс Арвидссон (Lars Arvidsson). XLSReadWrite это два компонента Delphi, TXLSRead и TXLSWrite спроектированы для доступа к XLS файлам Microsoft Excel. Нет необходимости устанавливать какие-то другие программы, в том числе Excel. TXLSRead могут читать файлы Excel 2.1, 3.0, 4.0, 5.0, 95, 97 и 2000. Вся информация из ячеек считывается, включая формулы и форматирование ячеек. TXLSWrite может записывать файлы Excel 4.0 и 5.0/ 95/ 97/ 2000. Также могут записываться формулы и форматироване ячеек. TXLSWrite записывает 100,000 ячеек менее чем за 2 секунды."
|
Взято с "Содержимое компакт диска к журналу RSDN Magazine"
или с Круглого стола Королевства Дельфи:
"Алгоритм я уже изменил — воспользовался вашим советом — с XlsReadWrite все работает, и гораздо быстрее."
"Вы нарвались на очень правильный и известный баг. Где-то здесь,
на Круглом столе, мы приводили ссылки на MSDN по этому поводу.
Дело в том, что под Win9x существует ограничение на количество
обращений к интерфейсам внешних COM-серверов."
Ответ на вопрос № 12131
хотите чего-то быстрее — пожалуйста, найдите описание формата
xls и сделайте сами.
Собственно то, чего и делают компоненты XLSReadWrite II,
работают с файлом xls напрямую без OLE и всего другого,
без установленного на компе Excel-a !!!
быстрее и придумать что-то трудно
Остается посоветовать выполнять данную операцию
на очень быстром компе P4 2400-3000 с 512Мь-2 Гб оперативки
на быстром винчестере 7200 rpm или SCSI 10000 rpm
|
|
Георгий |
Отправлено: 30.05.2003, 19:23 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
раскажи — почему у тебя сначала медленно работало и какой скорости (ячеек/час) удалось достигнуть? |
|
zja |
Отправлено: 01.06.2003, 14:44 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 11
|
сначала вообще никак не работало))) выгружал всю бд по таблично в самоадресующие структуры навроде
CODE |
struct tagTname_type_stucture{
int id_key; //ключ данной записи
AnsiString bla1; //поле таблицы
float bla2; //еще поле
int bla3; //еще поле
//и так далее , сколько полей в таблице, столько переменных
tagTname_type_stucture *p; // указатель на следующую структуру
//в которую загрузится следующая запись и таблицы
};
//название структур совпадало (для понятности) с названиями таблиц
tagTname_type_stucture *structure;
|
на форме лежал 1 компонент Query(BDE)|ADOQuery(ADO) — я кстати не заметил между ними никакой разницы в скорости, который получал в цикле собственно запрос
CODE |
SELECT * FROM table_name;
|
где table_name совпадала с именем структуры в которую помещался результат запроса(просто для удобства, чтоб не путаться), результат передавался примерно так
CODE |
try{ptagnew->bla3=Form1->DataSource1->DataSet->operator [] ("bla3");}catch(...){ptagnew->bla3=0;}
//try — т.к. поля содержащие NULL значения выбрасывали ошибку
|
с выгрузкой бд в такие структуры все было замечатльно, выгружались они относительно быстро(1-2 минуты, все операции производились на P2-400), а вот с загрузкой в excel(((
долго возился с типом tagVARIANT который активно используется в компонентах Office97, нашел ф-цию TVariant() которая вроде как на лету формирует из моего типа переменной тип tagVARIANT, радовался и хлопал в ладоши, на скорость переноса я тогда вовсе не смотрел, но она была очень низкая (примерно 100-300 строк в минуту), но тут встала другая проблема, при переносе некоторого количества строк (от 500 до 1000) компьютер намертво вис и точка. Тогда я обратился к примеру приведенному на данном сайте построенному на технологии OLE, как я уже писал выше, принципиально проблема не решилась, хотя чисто эмпирически количество перенесенных строк до момента зависания увеличилось примерно раза в 2.
Потом я воспользовался советом Владимира, скачал XLSReadWriteII и пытался работать с ним все еще используя свои структуры, выгрузка первый раз состоялась! но время на нее потраченное, вы будете смеяться — 5 часов, тогда я выкинул структуры, собственно они мне были нужны еще отчасти оттого, что результат выгрузки — это достаточно сложное объединение на уровне SQL, которое как мне сначала показалось данный вид SQL просто не в состоянии осуществить( как оказалось в дальнейшем я был не прав), на уровне структур данное объединение можно было получить гораздо легче и быстрей. Я решил воспользоваться интерфейсом таблиц, точнее возможностью просмотра в одной таблице значений из других таблиц (Lookup), и загружать полученный результат через компонент XLSDbRead(XLSReadWriteII) — результат 2 часа(( тогда я обратил внимание на то, что XLSReadWriteII — пишет действительно с очень большой скоростью, значит все упиралось в неправильный подход получения информации из бд. Я написал SQL запрос, который возвращал нужный мне результат(44 строки))) в окошке String List Editor) и уже его поставил как XLSDbRead->Dataset — результат 12 минут, а чтобы разделять результат по листам я построил несколько практически идентичных SQL-запросов, каждый из которых возвращал только часть результата, такую чтобы помещалась на лист(т.е.<65536 строк) и уже полученные результаты запросов через несколько компонентов xlsdbread записывал в один xlsreadwriteii, несколько xlsdbread потому, что при передаче нового dataset в один и тот же xlsdbread, скорость считывания падала примерно в два раза. я думаю если дальше исследовать данную задачу то скорость выгрузки можно уменьшить до 5 минут( например дальнейшая оптимизация sql-запроса, дальнейшее исследование утечек памяти, т.к. по-моему они всеравно где-то происходят, т.к. каждый следующий запрос (хотя они примерно равные по кол-ву возвращаемых строк) требует большего времени на загрузку, хотя я толком не знаю как с ними бороться(( не настолько еще опытный). основная часть программы свелась к:
CODE |
Database1->Connected=true;
Query1->Active=true;
XLSDbRead1->Read();
XLSReadWriteII1->Write();
Query1->Active=false;
Database1->Connected=false;
|
Если бы не возможная конкуренция (как минимум 1-н конкурент у меня точно есть) я бы выложил более подробный код, но если что, я отвечу на вопросы, т.к. никому не пожелаю повторить мой, более чем месячный путь к данному решению. Так же, если кто-то работает над похожими задачами и есть идеи по усовершенствованию решения, давайте их обсудим. |
|
zja |
Отправлено: 01.06.2003, 14:46 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 11
|
ячеек в час?
20х200000/(12*60)=~5555 ячеек в секунду |
|
Jimmy |
Отправлено: 04.06.2003, 10:38 |
|
Не зарегистрирован
|
не могли бы мне исходники прислать в качестве примера....
у меня есть как раз похожий проблемс....
надо в шаблон (*.xls) записать по 8 Листам по 15 (в среднем) столбцов, и от 4000 до 10000 строк.
Работал через OLE, как видите не помогло. 500 строк писал 2 мин. никуда не годится.
XLSReadWrite поставил уже, с вашей подачи.
А как, что и где, пока не разобрался.... щас этим займусь. Но если не трудно кому, пришлите исходник.
Спасибо заранее.
|
|
Jimmy |
Отправлено: 04.06.2003, 10:39 |
|
Не зарегистрирован
|
JimmyA@yandex.ru
для исходника |
|
угу |
Отправлено: 04.06.2003, 11:24 |
|
Не зарегистрирован
|
subj, уже послал, хотя боюсь он вам мало поможет, но вдруг |
|
Admin |
Отправлено: 04.06.2003, 20:33 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Описание на XLSReadWrite2 на английском языке
Файл приложен.
|
|
Гость_Gadzila |
Отправлено: 05.06.2003, 12:20 |
|
Не зарегистрирован
|
Давно мучаю ту-же проблемму.
Word через стандартные компоненты кое-как победил,
а вот с Excel — никак.
Почитал описалку по XLSReadWrite2, дык сразу появилось
желание попробовать.
Не подскажешь где можно найти этот самый XLSReadWrite2 ?? |
|
Jimmy |
Отправлено: 05.06.2003, 12:55 |
|
Не зарегистрирован
|
Взять можно здесь
www.axolot.com например
но вот она требует лицензии, у меня прога с этим компонентом перед запуском даёт окошко о том что это типа мол демо версия
а при создании (записи) файла в ячейке А1 авторская подпись болтается.....
можно взять здесь
http://delphi.chertenok.ru/download/1/xlsrw2_14.zip
он вроде как другой, поменьше весит, но при установке чё то ругается на отсутствие некого файла *.dcu....
Я эту проблему решаю, пока не решил.
В общем, фича класная, но не бесплатная.
Если кто пользуется этой штукой без проблем в BCB5, скажите как вы её поставили, пошагово...
thanks a lot |
|
|