Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > Delphi, Excel и грабли... |
Автор: Vit 13.9.2005, 17:16 | ||||||
Давеча пришлось поработать с Excel. Хочу поделиться несколькими впечатлениями. Подключался к Excel используя ADO и строку подключения: ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\имя файла.XLS;Extended Properties="Excel 8.0"; Первые грабли такие: Берём TADOQuery, подключаем connectionstring, выполняем запрос типа "Create Table...", если файл XLS не существует, то запрос благополучно создаёт указанный XLS файл со страницей, а вот если использовать TADOConnection для подключения - то подключится к несуществующему файлу и создать таким образом файл не получится... Вторые грабли посложнее будут, угрохал 3 часа и начал было даже сомневаться в своей умственной полноценности... Код простейший: перегоняю из таблицы другой базы данных данные в excel выполняя примерно следующий алгоритм (это упрощённый псевдокод):
И в результате получаю достаточно странную сортировку в Excel. Надо сказать что в Excel я делал собственно отчёт и сортировка мне была важна... Плясал с бубном долго, выяснилось что запрос 'Insert into MyExcelSheet ...' вставляет новую запись ПЕРВОЙ строкой, а не последней, как это принято в базах данных! Итого пришлось код переписать:
Третьи грабли: после выполнения хотя бы одного запроса на Excel, даже если вызывался ExecSQL и таблица не открыта - файл Excel остаётся заблокированным! Его нельзя открыть. Мне надо было полученный файл Excel после заполнения из программы открыть в Excel... Чтобы это сделать надо у ADOQuery обнулить ConnectionString:
|
Автор: bas 14.9.2005, 15:49 | ||
Проверил оба варианта (BCB5) - все нормально. И всталяеться в конец как и должно быть. |
Автор: SergeBS 14.9.2005, 16:45 |
Vit А зачем такой заковыристый способ? ADO все-таки под сервера заточено (в основном). Я через OLE все делал и вроде проблем нет. Тем более если из таблицы что-то шарашить - сразу в диапазон матрицу вписываешь. Вполне даже быстро получается. Если поячеечно - гораздо медленней. Насчет вставки первой строкой - вставляет туда, где selection. Т.е. все проблемы - что нужно прыгать в нужное место, а затем вставлять. Да, а насчет connection string - KeepConnection = true(default)? И потому ADOconnection и блокирует доступ - это ж не сервер, а файл. В этом небось грабельки. Проверь. Насколько шустро получаются все эти вставки у тебя через ADO? |
Автор: bas 14.9.2005, 17:41 | ||
На порядок. |
Автор: SergeBS 15.9.2005, 07:27 |
bas Мне всякие порядки неинтересны. "Столько-то записей на таком-то проце за столько-то секунд" - это я пойму. |
Автор: bas 15.9.2005, 10:25 |
AMD 2ГГц (ОЗУ 256) Win 98 Off.-2000 Одно поле символьное 65500 записей - 4мин 50 сек. Данные выбирались циклом (см. сооб. Vit) из DBase + ADO. |