Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > Excel&Delphi |
Автор: unter 4.9.2005, 18:21 |
Здраствуйте. ![]() Помогите пожалуйста с такой проблемой. ![]() Есть обработанный файл *.xls с 4-мя листами на которых нyжная информация. Обработанный - значит в таком виде, как его надо импортировать в базу данных через Query. ![]() var E, WorkBook, Sheet : Variant; //приложение Excel, книга, лист. Workbook:=E.Workbooks.Open(OpenDialog1.FileName); ![]() Каким образом можно загнать данные из диапазона ячеек этого файла *.xls, например А1[u]:G5, в таблицу DBGrid либо через Query либо через Table. ![]() В идеале надо получить данные с листа "Лист1" файла *.xls в таблице DBGrid !!! Через импорт в Access или конвертация в *.dbf нельзя делать! Нужно напрямую, либо чтобы все поверили, что это напрмую: Excel->DBGrid. Есть какие-нибудь варианты? ![]() Может например кто нить знает как считать по строкам и законять в DbGrid? ![]() Заранее спасибо. |
Автор: offline 4.9.2005, 22:19 |
Это всегда пожалуйста у ADOTable: ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\твой_файл.XLS;Extended Properties="Excel 8.0"; TableName имя нужного листа в квадратных скобках со знаком $. т.е. если у тебя имя листа Enot то в поле TableName должно быть [Enot$] ![]() Ну а дальше как обычно, через DataSource к DBGrid ![]() |
Автор: unter 5.9.2005, 12:12 |
5 баллов! , спасибо прибольшое, сам почему то не догадался!!!! ![]() ![]() |
Автор: unter 5.9.2005, 17:04 |
Опять ошибка! На форме есть компоненты: ADOTable1, DataSource1, ADOConnection1, DBGrid1 связанные между собой. У ADOConnection1 стоит СonnectionString такая: Provider=MSDASQL;Persist Security Info=False;Extended Properties="DBQ=D:\filename.xls;DefaultDir=D:\;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;FIL=excel 8.0;FILEDSN=D:\filename.xls.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ReadOnly=1;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" Хотя я пробовал менять провайдера, на OLEDB 4.0, один и тот же эффект! При попытке соединения компонента ADOTable1 (Active:=true) выкидывается сообщение: ///"[Microsoft][Драйвер ODBC]Ошибка сиснтаксиса в предложении from"/// В чем может быть проблема? |
Автор: offline 5.9.2005, 17:37 |
А ты правильно указал свойство TableName = [Лист1$], а то у меня все работает, то, что ты дал СonnectionString а попробуй так Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\filename.xls;Extended Properties="Excel 8.0"; |
Автор: unter 5.9.2005, 18:25 |
Короче видимо это были глюки какие то, просто перезапустил Delphi и все заработало как часы. ![]() ![]() Каким образом можно связать компоненты ADOQuery1 и Query1? ![]() Объясню: это надо для импорта в источник ODBC другую базу уже. Источник данных: ADOQuery1 (DBGrid1) -> Пункт назначения данных Query1 (DBGrid1 - база, зарегистрированная в BDE) Насколько знаю BatchMove вяжет только Query с Query. ![]() И еще вопрос: метод GetTableNames() получает имена таблиц из базы данных, зарегистрированной в BDE, а как дело обстоит у ADO? Как считать имена всех листов файла EXCEL? ![]() Спасибо. ![]() |
Автор: unter 5.9.2005, 19:56 |
Вопрос № 2 отменяется, считал поля и имена всех листов. Но проблема с преброской из ADOQuery в Query базу BDE стоит до сих пор. ![]() |
Автор: offline 5.9.2005, 21:14 | ||||
Можно сохранить результаты запроса в таблицу и сделать запрос уже к ней Читал такое, но сам не пробовал ![]()
т.ч. есть над чем подумать ![]() |
Автор: unter 6.9.2005, 08:02 |
Попробую че нить придумать, но идея у меня была такая, поглядим что получится из этого. ![]() |
Автор: unter 6.9.2005, 13:46 |
Вот как надо, нашел способо проще, Надо было сформировать динамический список, теперь попробую считать этот список и засунуть в Query. Это конечно не лучший способ но должен быть рабочим. Есть другие варианты? Сохранять какие то файлы что то не хочется... while not ADOQuery1.Eof //Öèêë, ïîêà ADOQuery1 íå ïóñò do begin TempList.Add(ADOQuery1.FieldByName('F1').AsString); ADOQuery1.Next(); end; ADOQuery1.Active:=true; ADOQuery1.First; while not ADOQuery1.Eof do begin TempList.Add(ADOQuery1.FieldByName('F1').AsString); ADOQuery1.Next(); end; ADOQuery1.Active:=true; ADOQuery1.First; |
Автор: unter 6.9.2005, 14:52 | ||
Блин, так не катит. Создал список TempList:TStrings загнал туда все поля ("F1,F2...") теперь все таки не могу перегнать из списка назад в Query для загрузки в базу данных через BDE. ![]() Need HELP!!! ![]() ![]() ![]() Каким образом можно связать компоненты ADOQuery1 и Query1? smile
|
Автор: offline 6.9.2005, 15:01 |
Ну сделай это через промежуточную таблицу. Если у тебя структура заранее известная, так в чем проблема. Выгрузи туда данные из ADOQuery1, а затем подай на Query1 эту таблицу. После выполнения запросов очисть таблицу. Вот и все. |
Автор: unter 7.9.2005, 08:45 |
![]() ![]() Я пробовал выгружать данные из Query в файл *.mdb, зарегистрированный в BDE. Структура заранее известна (точнее будет известна после обработки, но это мелочи). Добавлено @ 08:47 Что может выступать в роли промежуточной таблицы? И каким образом их туда выгрузить, а потом загрузить уже в Query? |
Автор: offline 7.9.2005, 10:25 |
Привет! Создай заранее фай таблицы с нужными полями (хотя это можно сделать програмно, но если у тебя структура постоянна, то создай заранее, что бы не тратилось время на это в программе). А передать данные можно например используя цикл пробежаться по запросу с первой до последней записи и перенести их в таблицу. или использовать компонент BatchMove предназначен для групповых операций переноса данных из одного набора в другой (но с ним я не работал). |
Автор: unter 7.9.2005, 19:27 | ||
Привет. BatchMove работает тока с Query, а об ADO он не слышал никогда насколько я знаю. Я тут подумал: может совсе не иcпользовать никакой Query: мне надо передать данные в базу в ОDBC прям из ADOQuery, это можно сделать сразу? В MSDN лазил так ничего и не нашел толкового. Зачем создавать какие то промежуточные таблицы? К тому же у меня 4 листа в файле excel, которые надо подгузить в ODBC (База на оракл или Access). Я с ADO просто не очень разобрался пока.
Thank`s. |
Автор: unter 8.9.2005, 08:36 | ||
Не мог бы ты поконкретнее объяснить как импортировать данные в базу на оракле, хотя с выводом их в файл все просто, только вот жалко, что ADOQuery понимает только 2 формата всего *.xml и *.adt ![]()
Я почему то так и не могу понять саму стратегию переноса этих данных в базу на оракле. ![]() Ведь Query - это таблица просмотра данных, кстати она не понимает методы LoadFromFile() насколько знаю. Он работает только с BDE. |
Автор: unter 8.9.2005, 08:47 | ||
Было бы шикарно написать что то типа:
![]() Но к сожалению компьютер он же дурак и не понимает, что ему говорят, он тока свои несовершенные коды воспринимает. ![]() |
Автор: offline 8.9.2005, 09:43 | ||||||
так я не понял, ты от этого отказался? Я работал только с Аксесом там можно сделать так
или
|
Автор: unter 8.9.2005, 17:00 |
Спасибо за дельные советы. ![]() ![]() Еще раз спасибо. ![]() |
Автор: Bes 13.9.2005, 13:56 |
А что вместо вот этого ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\твой_файл.XLS;Extended Properties="Excel 8.0"; надо писать чтобы так же работать с DBF файлами? Спасибо |
Автор: unter 13.9.2005, 19:23 |
Bes Здесь все просто, ты можешь скормить ему любой файл: s:= OpenDialog1.FileName; ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + s + ';Extended Properties=Excel 8.0;Persist Security Info=False'; Либо второй вариант, не использовать ADO а сделать напрямую через Query. Для этого просто зарегистрируй базу в ODBC и обращайся к ней через BDE. |
Автор: Bes 14.9.2005, 08:27 |
Не.. мне через АДО удобнее тем более что такой вариант не требует предварительной установки БДЕ на рабочую машину. Добавлено @ 08:36 Фигу! "Внешняя таблица не имеет предполагаемый формат". - не работает!!! |
Автор: offline 14.9.2005, 09:22 | ||
может что поможет ![]() |
Автор: Bes 14.9.2005, 14:10 |
Во, спасибо. |
Автор: Akella 19.9.2005, 16:37 | ||||
а причём здеся кверя??? или кверя или доступ через COM. Короче, парни не парьтесь а воспользуйтесь поиском в этой теме форума, или идите в FAQ, или качайте DRKB и будет вам счастье |