Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi, Excel и грабли... 
:(
    Опции темы
Vit
Дата 13.9.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Давеча пришлось поработать с 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 выполняя примерно следующий алгоритм (это упрощённый псевдокод):


Код

MyExcelADOQuery.sql.text:='Insert into MyExcelSheet (Field1, field2, ...) Values (:param1, :Param2, ...)';
MySourceTable.first;
while not MySourceTable.eof do
  begin
    for i:=0 to MySourceTable.fields.count-1 do
       MyExcelADOQuery.parameters[i].value:=MySourceTable.fields[i].value;
    MyExcelADOQuery.execSQL;
    MySourceTable.next;
  end;


И в результате получаю достаточно странную сортировку в Excel. Надо сказать что в Excel я делал собственно отчёт и сортировка мне была важна... Плясал с бубном долго, выяснилось что запрос 'Insert into MyExcelSheet ...' вставляет новую запись ПЕРВОЙ строкой, а не последней, как это принято в базах данных! Итого пришлось код переписать:

Код

MyExcelADOQuery.sql.text:='Insert into MyExcelSheet (Field1, field2, ...) Values (:param1, :Param2, ...)';
MySourceTable.last;
while not MySourceTable.bof do
  begin
    for i:=0 to MySourceTable.fields.count-1 do
       MyExcelADOQuery.parameters[i].value:=MySourceTable.fields[i].value;
    MyExcelADOQuery.execSQL;
    MySourceTable.prior;
  end;


Третьи грабли: после выполнения хотя бы одного запроса на Excel, даже если вызывался ExecSQL и таблица не открыта - файл Excel остаётся заблокированным! Его нельзя открыть. Мне надо было полученный файл Excel после заполнения из программы открыть в Excel... Чтобы это сделать надо у ADOQuery обнулить ConnectionString:

Код

MyExcelADOQuery.ConnectionString='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\имя файла.XLS;Extended Properties="Excel 8.0"';
MyExcelADOQuery.sql.text:='Create table ...';
MyExcelADOQuery.ExecSQL;
MyExcelADOQuery.sql.text:='Что-то там мне необходимое';
MyExcelADOQuery.ExecSQL;
MyExcelADOQuery.ConnectionString=''; //! Вот оно, без этого полученный файл не откроешь!
ShellExecute(handle, '', 'MyFile.xls'....




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
bas
Дата 14.9.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



Цитата(Vit @ 13.9.2005, 14:16)
Первые грабли такие:
Берём TADOQuery, подключаем connectionstring, выполняем запрос типа "Create Table...", если файл XLS не существует, то запрос благополучно создаёт указанный XLS файл со страницей, а вот если использовать TADOConnection для подключения - то подключится к несуществующему файлу и создать таким образом файл не получится...

Проверил оба варианта (BCB5) - все нормально.
И всталяеться в конец как и должно быть.


PM MAIL   Вверх
SergeBS
Дата 14.9.2005, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Vit
А зачем такой заковыристый способ? ADO все-таки под сервера заточено (в основном).
Я через OLE все делал и вроде проблем нет. Тем более если из таблицы что-то шарашить - сразу в диапазон матрицу вписываешь. Вполне даже быстро получается.
Если поячеечно - гораздо медленней.

Насчет вставки первой строкой - вставляет туда, где selection. Т.е. все проблемы - что нужно прыгать в нужное место, а затем вставлять.

Да, а насчет connection string - KeepConnection = true(default)? И потому ADOconnection и блокирует доступ - это ж не сервер, а файл. В этом небось грабельки. Проверь.

Насколько шустро получаются все эти вставки у тебя через ADO?

PM MAIL   Вверх
bas
Дата 14.9.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



Цитата(SergeBS @ 14.9.2005, 13:45)
Насколько шустро получаются все эти вставки у тебя через ADO?

На порядок.
PM MAIL   Вверх
SergeBS
Дата 15.9.2005, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



bas
Мне всякие порядки неинтересны. "Столько-то записей на таком-то проце за столько-то секунд" - это я пойму.

PM MAIL   Вверх
bas
Дата 15.9.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



AMD 2ГГц (ОЗУ 256) Win 98 Off.-2000
Одно поле символьное
65500 записей - 4мин 50 сек.
Данные выбирались циклом (см. сооб. Vit) из DBase + ADO.

Это сообщение отредактировал(а) bas - 15.9.2005, 10:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.