Datenbank: Excel • Version: 12.0 • Zugriff über: ADO
Mit ADO eine Exceltabelle (12.0) auslesen?
Hallo :cry:
ich habe kein Excel bzw. nur den Excelviewer. Ich habe aber das ACE-Dings installiert und bekomme auch mit folgendem Code einen Connect zur Datei: Ich habe dabei diese Quelle als Grundlage genommen: http://www.delphipraxis.net/128818-e...lte-fehlt.html
Delphi-Quellcode:
Bis hier geht es und die "Leitung steht".
procedure TForm1.Button8Click(Sender: TObject);
var TabSL:TStringList; fdb,sTableName,s: string; iMaxCol,iMaxRows,iCol,iRow:integer; grid:TSortGRid; begin try if ADOConArt.Connected then ADOConArt.Close; except end; fDB:='C:\Test\Excel\Tabelle.xlsx'; if uppercase(extractFileExt(fDB))='.XLSX' then s:= 'Provider=Microsoft.ACE.OLEDB.12.0; ' + //xlsx 'Extended Properties=Excel 12.0;' else if uppercase(extractFileExt(fDB))='.XLS' then s:= 'Provider=Microsoft.Jet.OLEDB.4.0; ' + //xls 'Extended Properties=Excel 8.0;' else s:=''; if s='' then showmessage('Datei wird nicht unterstützt...') else begin ADOConArt.ConnectionString := s+'Data Source='+ fDB +'; Persist Security Info=False'; ADOConArt.Open;
Delphi-Quellcode:
Ob das geklappt hat, bin ich mir nicht mehr so sicher...
if ADOConArt.Connected then
try TabSL:=TStringList.Create; Grid:=TSortGrid.Create(Form1); ADOConArt.GetTableNames(TabSL, False); for iMaxCol := 0 to TabSL.Count-1 do if pos('$',TabSL[iMaxCol])>0 then begin sTableName:= TabSL[iMaxCol]; break; end; ADODataSet1.CommandText:= 'SELECT * FROM [' + sTableName + ']'; ADODataSet1.Open;
Delphi-Quellcode:
Hier hängt es dann und kehrt nicht zurück. :cry:
// Zuweisen der Tabellenzeilen
iMaxRows := ADODataSet1.RecordCount; Und so sollte es weitergehen, ...
Delphi-Quellcode:
1) Woran mag das liegen, daß ich das Blatt nicht auslesen kann?
Grid.RowCount:= iMaxRows;
// Anzahl der Spalten ermitteln iMaxCol := ADODataSet1.FieldCount; Grid.ColCount:=iMaxCol; // Auf den ersten Datensatz springen ADODataSet1.First; // Dataset auslesen for iRow := 0 to iMaxRows-1 do begin for iCol := 0 to iMaxCol-1 do begin grid.Cells[iCol,iRow] := ADODataSet1.Fields[(iCol)].AsString end; ADODataSet1.Next; end; ADODataSet1.Close; Grid.SaveToFile(fDB+'.csv',#9); finally TabSL.Free; Grid.Free; end; ADOConArt.Close; end; end; 2) Ich habe immer das Stringgrid-Verständnis, schön mit den Cells und so. ADODataSet scheint völlig anders aufgebaut zu sein. 3) Ich habe einiges über den Zugriff und so gelesen - "Records" sind Rows und "Fields" sind Columns? Irgendwie scheine ich bisher nie bis zur "Rasterebene" vorgedrungen zu sein... 4) Eigentlich will ich "nur" aus einer KillerTabelle (knapp 20MB, 10k Zeilen, 200 Spalten - die OpenOfficeCalc nicht einlesen kann und dabei hängen bleibt; ExcelViewer aber kein Problem damit hat) 2 Spalten auslesen und in eine Textdatei abspeichern; ergänzend kleine Tabellen komplett auslesen. Wegen diesem "bisschen" möchte ich mir eigentlich nicht teure Komponenten kaufen müssen, die Excel optimal unterstützen... Bitte helft mir :pale: |
AW: Mit ADO eine Exceltabelle (12.0) auslesen?
habs mal anhand Deines Codes nachgestellt mit einer .xls und es funktioniert.
Verwende doch mal zum Testen ein DBGrid und verbinde es mit TDataSource mit dem ADODataSet1, dann siehst Du direkt was auf dem Bildschirm. |
AW: Mit ADO eine Exceltabelle (12.0) auslesen?
Zitat:
|
AW: Mit ADO eine Exceltabelle (12.0) auslesen?
Zitat:
Delphi-Quellcode:
fehlt?
CommandType := cmdText;
und was sagt der Debugger? Gruß K-H |
AW: Mit ADO eine Exceltabelle (12.0) auslesen?
Hallo und danke erstmal fürs mitdenken...
Ich habe mal zu allen Events von ADOConArt einen Text erstellt, damit ich selber weiß, welche Abfolge da drankommt:
Code:
...und dann hängt es. Wie bekomme ich heraus, was da oben für ein Fehler (an dem es wohl scheitert) passiert ist?
: Beforeconnect
: OnWillConnect : OnLogin : OnInfoMessage, Error: Ein aus mehreren Schritten bestehender Vorgang wurde mit mindestens einem Fehler abgeschlossen. Prüfen Sie die einzelnen Statuswerte. : Afterconnect : OnWillExecute @Sven: ich bin bemüht, eine .xlsX-Datei einzulesen; aber auch die normalen .xls hängen dort: Zitat:
Programm bleibt an dieser Stelle mit 50% Prozessorlast hängen und kommt von dort nicht zurück. Kann es sein, daß nach dem ADODataSet1.Open die Eigenschaften DataSetField und DataSource weiter auf NIL stehen (könnte ja sein, daß das normal ist)? Welche weiteren Eigenschaften in den Komponenten könnte ich falsch eingestellt haben (bei meinen verpeilten Versuchen)?
Delphi-Quellcode:
:cry:
//Für ADODataSet1-Komponente
CursorType:= ctStatic; //irgendwo las ich, das man das tun sollte ExecuteOptions:= [eoAsyncExecute,eoAsyncFetch,eoAsyncFetchNonBlocking]; //Ich wollte eine Progressbar während dem Einlesen haben, weil die Datei so groß ist - aber das funktioniert auch nicht ... lockType:= ltReadOnly; //ich wills ja nur lesen //Für ADOConArt-Komponente ConnectionTimeOut:=1200; ConnectOptions:= coAsyncConnect; LoginPrompt:=false; Mode:= cmRead; Provider:=Microsoft.ACE.OLEDB.12.0; //Wird dann ja im Quelltext bei XLS-Dateien geändert auf "Microsoft.Jet.OLEDB.4.0", um beide Typen abzudecken. |
AW: Mit ADO eine Exceltabelle (12.0) auslesen?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab an den Standardeinstellungen nichts geändert.
xls habe ich genommen, weil ich den ACE Treiber nicht installiert habe. Ich hab mal mein Testprojekt angehängt. Du musst nur im Quelltext den Ort der Excel-Datei ändern. Probiere es mal mit einer kleinen selbst erstellten Excel-Datei. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz