C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
BCB6vsExcel97, передача больших массивов
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 на английском языке

Файл приложен.

User Attached Image Скачать файл
xlsrw2_pdf.zip


Гость_Gadzila
Отправлено: 05.06.2003, 12:20


Не зарегистрирован







Давно мучаю ту-же проблемму.
Word через стандартные компоненты кое-как победил,
а вот с Excel — никак.
Почитал описалку по XLSReadWrite2, дык сразу появилось
желание попробовать. biggrin.gif
Не подскажешь где можно найти этот самый 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

Вернуться в Вопросы программирования в C++Builder