PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADO und Excel


Sascha Seegebarth
10.02.2000, 13:09
Hallo,

ich würde gerne die Werte der Zellen eines ExcelWorkSheets auslesen.
Kann ich ein WorkSheet als ADO-Datenmenge auslesen oder muß ich
die Daten über OleAutomation auslesen ??

Thx
Sascha

Andreas Kosch
11.02.2000, 17:27
Hallo,

ADO kann direkt die Daten aus einer Excel-Tabelle als "Datenbanktabelle" auswerten. Mit den neuen ADO-Komponenten von Delphi 5 ist dazu im Objektinspektor die folgende Konfiguration notwendig:
<pre>
object ExcelDataSet: TADODataSet
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Forecast.xls;Extended Properties' +
'=Excel 8.0;Persist Security Info=False'
CursorType = ctStatic
CommandText = 'select * from Forecast'
CommandType = cmdUnknown
Parameters = <>
Left = 40
Top = 48
end
object ExcelDataSource: TDataSource
DataSet = ExcelDataSet
Left = 44
Top = 112
end
</pre>
Die EXCEL-Tabelle wird über eine SELECT-Anweisung abgefragt. Stehen die ADO-Komponenten nicht zur Verfügung, kann man aber auch direkt über das <b>RecordSet</b>-Objekt von ADO auf die Excel-Tabelle zugreifen

Sascha Seegebarth
16.02.2000, 15:49
Hallo Herr Kosch,

danke für die Beantwortung der Frage. Allerdings habe ich noch ein Problem.

Wenn ich über TableDirect gehe, dann funktioniert es perfekt.

object ADODataSet1: TADODataSet
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
'Source=c:\wochentage.xls;Mode=Share Deny None;Extended Propertie' +
's=Excel 8.0;Locale Identifier=0;Jet OLEDB:System database="";Jet' +
' OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLED'
CursorType = ctStatic
CommandText = 'Wochen$'
CommandType = cmdTableDirect
FieldDefs = <
item
Name = 'Wochentage'
Attributes = [faFixed]
DataType = ftFloat
end
item
Name = 'Bezeichnung'
DataType = ftWideString
Size = 255
end>
Parameters = <>
StoreDefs = True
Left = 20
Top = 204
end

Probiere ich es allerdings über ein SQL-Statement, so erhalte ich die die Fehlermeldung: Systaxfehler in FROM-Klausel.

object ADODataSet2: TADODataSet
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
'Source=c:\wochentage.xls;Mode=Share Deny None;Extended Propertie' +
's=Excel 8.0;Locale Identifier=0;Jet OLEDB:System database="";Jet' +
' OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLED'
CursorType = ctStatic
CommandText = 'select * from Wochen$'
Parameters = <>
Left = 272
Top = 204
end

Hätten Sie evtl. eine Idee was falsch sein kann ?

Thx Sasch

Andreas Kosch
17.02.2000, 10:06
Hallo,

was bedeutet das <b>$</b> in der Zeile <i>CommandText = 'select * from Wochen$'</i>? Ich gehe einmal davon aus, das dieser Eintrag durch die Zeichenkette "Wochentage" ersetzt werden muss

Reinhold Erlacher
05.08.2000, 21:25
ich glaube das problem läßt sich folgendermaßen lösen: "select * from [Wochen$]". Bei sonderzeichen muß der tabellenname in eckigen klammern geschrieben werden

Jens Schumann
11.03.2002, 20:26
Hallo,<br>
ich versuche gerade eine Tabelle aus einem Excelworksheet (Excel 97) über ein Recordset zu lesen.<br>
Das Worksheet hat den Namen Tab1.<br>
Aber ich schaffe es nicht. Was mach ich bloß falsch?<br>
Connectionstring:<pre>
<font face="Verdana" size="1" color="#000000">[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Delphi5\Test\Excel über Recordset\Text.xls;
Extended Properties=Excel 8.0;Persist Security Info=False</font>
</pre>
hier der Source:<br>
<pre>
<font face="Verdana" size="1" color="#000000">resourcestring
ConnectionString='FILE NAME=excel.udl';

procedure TForm1.Button1Click(Sender: TObject);
var
CN : Connection;
RS : Recordset;
SQL : OleVariant;
begin
SQL:='SELECT * FROM Text';
CN:=CoConnection.Create;
RS:=CoRecordset.Create;
Try
CN.Open(ConnectionString,'','',-1);
RS.Open(SQL,CN,adOpenStatic,adLockOptimistic,adCmd Unspecified);
Finally
CN:=Nil;
RS:=NIL;
end;
end;</font>
</pre>
Ich erhalte immer Syntaxfehler in FROM-Klausel. Ich weiß auch nicht, wie im Select das Worksheet angebe, dass ich abfragen möchte.<br>
Der Dateienamen im SELECT kann doch ausreichend sein.<br&gt

Andreas Kosch
12.03.2002, 14:39
Hallo,

in diesem Spiel gibt es gleich 2 Beteiligte, die Einfluss auf die Syntax haben: <br>
1. OLE DB Provider (Jet Engine oder ODBC) <br>
2. Excel-Version (97 vs. 2000 vs.2002)<br>
Bei mir ist der folgende Aufruf erfolgreich, wobei der Worksheet-Name in eckigen Klammern mit einem abschliessenden $-Zeichen auftaucht):
<pre>
uses ADOInt; // ADO-Interfaces + CoClass-Hilfsfunktionen

const
cCS = 'Provider=MSDASQL.1;Data Source=ADOEXCEL';
cSQL = 'SELECT Count(*) FROM [Personal$]';

procedure TForm1.Button1Click(Sender: TObject);
var
aCon : _Connection;
vRowsAffected : OleVariant;
begin
aCon := CoConnection.Create;
aCon.CursorLocation := adUseClient;
aCon.Open(cCS, '', '', adConnectUnspecified);
try
aCon.Execute(cSQL, vRowsAffected, adOptionUnspecified);
ShowMessage('Der Aufruf war erfolgreich');
finally
aCon.Close;
aCon := nil;
end;
end;
</pre&gt

A. Herrmann
14.03.2002, 11:04
Hallo Jens,

im Select mußt du den WorkSheetnamen als Tabellennamen angeben.
z.B. SELECT * FROM [Tabelle1$]

Eine Liste der verfügbaren Tabellen (WorkSheets) bekommst du mit Hilfe von ADOConnection.GetTableNames(...
Was die Tabellen (WorkSheets) sind bei denen nach dem "$" Zeichen noch weitere Zeichen folgen kann ich dir leider auch nicht sagen. Ich filtere diese in einer Funktion heraus, da man sie scheinbar sowieso nicht ansprechen kann.

Andrea

Jens Schumann
14.03.2002, 19:17
Hallo, <br>
genau das ist es . Vielen Dank !!!<br>
Der Grund weshalb ich über das Recordset gehe ist, das unter Win95 das Programm<br>
immer abschmiert wenn zu viele Interfaces angefordert werden. <br>
Bislang lesen immer jede Zelle einzeln über das Range Interface ein.<br>
Unter Win2k läuft das Porgramm "Stunden" ohne Probleme. Unter Win95 ist meißt nach<br>
3 Minuten Schluß.<br>
<br>
Habe ich, wenn ich ein RecordSet verwende, mit den gleichen Problemen zu rechnen ?<br&gt

Jens Schumann
15.03.2002, 11:41
Hallo,<br>das Lesen eines WorkSheets klappt ja prima über ein Recordset. Wenn ich aber den Inhalt einer Zelle mit RS.Fields.Item[iCnt].Value:='Change'; ändere, kann ich die Excel-Datei nicht mehr öffnen.<br>Wie kann man über ADO in ein Worksheet schreiben

Thomas Schall
04.04.2002, 15:42
Vielleicht "SELECT * FROM Tab1"?
Hatte neulich auch das Problem und mich dann dafür entschieden, daß Excel-Sheet anders zu bearbeiten (über Office-Automation) ..