Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Excel&Delphi


Автор: unter 4.9.2005, 18:21
Здраствуйте. smile
Помогите пожалуйста с такой проблемой. smile
Есть обработанный файл *.xls с 4-мя листами на которых нyжная информация. Обработанный - значит в таком виде, как его надо импортировать в базу данных через Query. smile

var E, WorkBook, Sheet : Variant; //приложение Excel, книга, лист.
Workbook:=E.Workbooks.Open(OpenDialog1.FileName); smile

Каким образом можно загнать данные из диапазона ячеек этого файла *.xls, например А1[u]:G5, в таблицу DBGrid либо через Query либо через Table. smile
В идеале надо получить данные с листа "Лист1" файла *.xls в таблице DBGrid !!!
Через импорт в Access или конвертация в *.dbf нельзя делать! Нужно напрямую, либо чтобы все поверили, что это напрмую: Excel->DBGrid. Есть какие-нибудь варианты? smile
Может например кто нить знает как считать по строкам и законять в DbGrid? smile

Заранее спасибо.

Автор: 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$] smile

Ну а дальше как обычно, через DataSource к DBGrid

smile

Автор: unter 5.9.2005, 12:12
5 баллов! , спасибо прибольшое, сам почему то не догадался!!!! smile Видимо критические дни! smile

Автор: 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 и все заработало как часы. smile smile

Каким образом можно связать компоненты ADOQuery1 и Query1? smile

Объясню: это надо для импорта в источник ODBC другую базу уже.

Источник данных: ADOQuery1 (DBGrid1) -> Пункт назначения данных Query1 (DBGrid1 - база, зарегистрированная в BDE)
Насколько знаю BatchMove вяжет только Query с Query. smile
И еще вопрос: метод GetTableNames() получает имена таблиц из базы данных, зарегистрированной в BDE, а как дело обстоит у ADO? Как считать имена всех листов файла EXCEL? smile
Спасибо. smile

Автор: unter 5.9.2005, 19:56
Вопрос № 2 отменяется, считал поля и имена всех листов.
Но проблема с преброской из ADOQuery в Query базу BDE стоит до сих пор. smile

Автор: offline 5.9.2005, 21:14
Цитата
Запрос выполняется на серваке, а он не знает, что такое TQuery, он понимает только SQL (для файлов dbf, db и подобных BDE прикидывается серваком). TQuery - это компонент твоей программы, он выдал тебе данные, а дальше работай с ними сам, BDE больше не поможет.


Можно сохранить результаты запроса в таблицу и сделать запрос уже к ней

Читал такое, но сам не пробовал smile
Цитата
В LocalSQL существует возможность делать запрос по результатам другого запроса. Для этого нужно текст первого запроса сохранить в файле с расширением sql.
А второй запрос будет выглядеть примерно так:
select * from tmp.sql
Подробнее - в help LocalSQL.


т.ч. есть над чем подумать smile

Автор: unter 6.9.2005, 08:02
Попробую че нить придумать, но идея у меня была такая, поглядим что получится из этого. smile

Автор: 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. smile
Need HELP!!! smile smile smile
Каким образом можно связать компоненты ADOQuery1 и Query1? smile

Цитата
Объясню: это надо для импорта в источник ODBC другую базу уже.

Источник данных: ADOQuery1 (DBGrid1) -> Пункт назначения данных Query1 (DBGrid1 - база, зарегистрированная в BDE)
Насколько знаю BatchMove вяжет только Query с Query. smile

Автор: offline 6.9.2005, 15:01
Ну сделай это через промежуточную таблицу. Если у тебя структура заранее известная, так в чем проблема. Выгрузи туда данные из ADOQuery1, а затем подай на Query1 эту таблицу. После выполнения запросов очисть таблицу. Вот и все.

Автор: unter 7.9.2005, 08:45
smile из ADOQuery можно выгрузить данные например в какую таблицу, чтобы считать сразу их от туда в Query? Идею то я понял, но такого никогда не делал. smile
Я пробовал выгружать данные из 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 smile (
Код

ADOQuery.SaveToFile('Test.xml')
)
Я почему то так и не могу понять саму стратегию переноса этих данных в базу на оракле. smile
Ведь Query - это таблица просмотра данных, кстати она не понимает методы LoadFromFile() насколько знаю. Он работает только с BDE.

Автор: unter 8.9.2005, 08:47
Было бы шикарно написать что то типа:

Код

whiile not ADOQuery1.Eof 
do begin
Query1.SQL.Append(ADOQuery.все записи попорядку);
Query1.Next(); 
end;
smile
Но к сожалению компьютер он же дурак и не понимает, что ему говорят, он тока свои несовершенные коды воспринимает. smile

Автор: offline 8.9.2005, 09:43
Цитата
может совсе не иcпользовать никакой Query: мне надо передать данные в базу в ОDBC прям из ADOQuery, это можно сделать сразу?


так я не понял, ты от этого отказался?

Я работал только с Аксесом
там можно сделать так

Код

whiile not ADOQuery1.Eof do begin
 Table2.FieldByName('Поле1').AsString := ADOQuery1.FieldByName('Поле1').AsString;
 Table2.FieldByName('Поле2').AsString := ADOQuery1.FieldByName('Поле2').AsString;
 Table2.FieldByName('Поле3').AsString := ADOQuery1.FieldByName('Поле3').AsString;
 ...
 ADOQuery1.Next; 
end;


или

Код

 INSERT INTO Table2 (Поле1, Поле2, Поле3, ... ) 
 SELECT Поле1, Поле2, Поле3, ... FROM Table1 
 WHERE условие


Автор: unter 8.9.2005, 17:00
Спасибо за дельные советы. smile Я извиняюсь, но придет ненадолго отъехать (несколько дней), если появятся вопросы я напишу. smile
Еще раз спасибо. smile

Автор: 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
Цитата

TDBF с www.torry.net или www.sourceforge.net Эти компоненты полностью повторяют методы TBDEDataset, работают быстро и утежеляют exe на 100К всего

или

VKDBF http://vlad-karpov.narod.ru/ - быстро, просто, куча дополнительных фич, бесплатно, наше в конце концов smile


dBase
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=dBase IV;Persist Security Info=False
Paradox
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=Paradox 4.x;Persist Security Info=False


может что поможет smile

Автор: Bes 14.9.2005, 14:10
Во, спасибо.

Автор: Akella 19.9.2005, 16:37
Цитата(unter @ 4.9.2005, 18:21)
Есть обработанный файл *.xls с 4-мя листами на которых нyжная информация. Обработанный - значит в таком виде, как его надо импортировать в базу данных через Query. 


Цитата(unter @ 4.9.2005, 18:21)
var E, WorkBook, Sheet : Variant; //приложение Excel, книга, лист.
Workbook:=E.Workbooks.Open(OpenDialog1.FileName); 

а причём здеся кверя???

или кверя или доступ через COM.

Короче, парни не парьтесь а воспользуйтесь поиском в этой теме форума, или идите в FAQ, или качайте DRKB и будет вам счастье

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)