![]() |
Datenbank: Paradox • Version: 7 • Zugriff über: TQuery
Inhald eines DBGrid nach Excel exportieren ?
hallo,
kann man den inhald eines DBGrid nach excel exportieren,wenn ja, wie ??? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Hallo Vader,
entweder du schreibst die Zeilen selber nach Excel...
Delphi-Quellcode:
Oder du übergibst die SQL-Abfrage, die dein DBGrid anzeigt an Excel...
uses ... OleServer, Excel2000 ...
: : var Excel:TExcelApplication; lcid:integer; Workbook:_Workbook; Inhalt:Variant; begin Excel:=TExcelApplication.Create(Self); try lcid:=GetUserDefaultLCID; Excel.Connect; Excel.Visible[lcid] := true; Excel.UserControl:=true; Workbook:=Excel.Workbooks.Add(EmptyParam, lcid); Inhalt:='Hallo'; Excel.Cells.Range['A1', 'A1'].Value:=Inhalt; finally Excel.Disconnect; Excel.free; end; end; (Excel holt dann selbst die Daten von der Datenbank)
Delphi-Quellcode:
Dafür muss allerdings die MSQuery installiert sein.
uses ... OleServer, Excel2000 ...
: : var Excel:TExcelApplication; lcid:integer; Workbook:_Workbook; Query, Range, Sheet:Variant; User, Database, ODBCname:string; begin Excel:=TExcelApplication.Create(Self); try lcid:=GetUserDefaultLCID; Excel.Connect; Excel.Visible[lcid] := true; Excel.UserControl := true; Workbook:=Excel.Workbooks.Add(EmptyParam, LCID); User:='ich'; ODBCname:='LocalServer'; Database:='MeineDatenbank'; Sheet:=Workbook.ActiveSheet; Range := Excel.Cells.Range['A1', 'A1']; Query:=Sheet.QueryTables.Add( 'ODBC;' + 'DSN=' + ODBCname + ';' + 'UID=' + User + ';' + 'APP=Microsoft® Query;' + 'DATABASE=' + Database + ';' + 'Trusted_Connection=Yes', Range ); Query.CommandText:='SELECT * FROM tabelle'; Query.Name:= 'Meine Abfrage von LocalServer'; Query.FieldNames := True; Query.RowNumbers := False; Query.FillAdjacentFormulas := False; Query.PreserveFormatting := True; Query.RefreshOnFileOpen := False; Query.BackgroundQuery := True; Query.RefreshStyle := xlInsertDeleteCells; Query.SavePassword := True; Query.SaveData := True; Query.AdjustColumnWidth := True; Query.RefreshPeriod := 0; Query.PreserveColumnInfo := True; Query.Refresh(False); finally Excel.Disconnect; Excel.free; end; end; Edit... und hier nochmal eine Methode, die ein DBGrid erwartet und den Inhalt direkt nach Excel schreibt...
Delphi-Quellcode:
MfG
procedure DBGridToExcel(DBGrid:TDBGrid; StartSpalte, StartZeile:integer);
type TSpalten = array[1..256] of string; function CreateSpalten:TSpalten; var i, j, x:integer; abbruch:boolean; begin x:=1; abbruch:=false; j:=0; while (j <= 26) and not abbruch do begin i:=1; while (i <= 26) and not abbruch do begin if j = 0 then Result[x]:=chr(i+64) else Result[x]:=chr(j+64)+chr(i+64); inc(i); inc(x); abbruch:=(x > 256); end; inc(j); end; end; var Excel:TExcelApplication; i, Zeile, lcid:integer; Workbook:_Workbook; Sheet, Zelle, Inhalt:Variant; Spalten:TSpalten; begin if assigned(DBGrid) and assigned(DBGrid.DataSource) and assigned(DBGrid.DataSource.DataSet) then begin if DBGrid.DataSource.DataSet.Active then begin Excel:=TExcelApplication.Create(nil); try lcid:=GetUserDefaultLCID; Excel.Connect; Excel.Visible[lcid]:=true; Excel.UserControl:=true; Workbook:=Excel.Workbooks.Add(EmptyParam, lcid); Spalten:=CreateSpalten; Zeile:=StartZeile; for i:=1 to DBGrid.FieldCount do begin Inhalt:=DBGrid.Fields[i-1].DisplayName; Zelle:=Excel.Cells.Range[ Spalten[i+StartSpalte-1]+inttostr(Zeile), Spalten[i+StartSpalte-1]+inttostr(Zeile) ]; Zelle.Value:=Inhalt; Zelle.Font.Bold:=true; end; DBGrid.DataSource.DataSet.First; while not DBGrid.DataSource.DataSet.Eof do begin inc(Zeile); for i:=1 to DBGrid.FieldCount do begin Inhalt:=DBGrid.DataSource.DataSet.FieldByName( DBGrid.Fields[i-1].FieldName ).AsString; Zelle:=Excel.Cells.Range[ Spalten[i+StartSpalte-1]+inttostr(Zeile), Spalten[i+StartSpalte-1]+inttostr(Zeile) ]; Zelle.Value:=Inhalt; end; DBGrid.DataSource.DataSet.Next; end; Sheet:=Workbook.ActiveSheet; Sheet.Columns[ Spalten[StartSpalte]+':'+Spalten[StartSpalte+DBGrid.FieldCount] ].EntireColumn.AutoFit; finally Excel.Disconnect; Excel.free; end; end; end; end; Thorsten |
Re: Inhald eines DBGrid nach Excel exportieren ?
hall omata
habe deinen letzten code ausprobiert, aber es kommt der fehler
Delphi-Quellcode:
ach noch was, ich hab da eine komponente bei mir gefunden die heißt " ExcelQueryTable " ,
[Fehler] Unit1.pas(113): Undefinierter Bezeichner: 'Range'
ist die mir bei meinen anliegen behilflich ? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo,
das mit dem range hat sich erledigt, ich muß bei D6 das so schreiben
Delphi-Quellcode:
aber wie rufe ich deine
Zelle:=Excel.Cells.Range_
Delphi-Quellcode:
auf ??
procedure DBGridToExcel(DBGrid:TDBGrid; StartSpalte, StartZeile:integer);
type TSpalten = array[1..256] of string; habe es so versucht,
Delphi-Quellcode:
eine excelmappe wird geöffnet aber es wird nichts importiert ???
procedure TForm1.Button3Click(Sender: TObject);
begin DBGridToExcel(DBGrid1,1,1); end; mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Wird den im DBGrid etwas angezeigt?
Nur dann wird auch etwas exportiert. Gruss Thorsten |
Re: Inhald eines DBGrid nach Excel exportieren ?
Liste der Anhänge anzeigen (Anzahl: 1)
siehe foto !
mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Tja, dann weiss ich das auch nicht.
Was ist den mit der 1. Variante? Funktioniert die? Was ist mit der 2. Variante, gibt es ein SQL-Statement? Kannst du nicht das nehmen und mit Excel abfragen? Bei der 3. Variante was sagt das der Debugger? Geh doch mal die einzelnen Zeilen durch, bei welcher macht er den nicht das was du willst? Ist DBGrid.FieldCount > 0? Fragen über Fragen, meine Glaskugel ist heute leider zur Reperatur... |
Re: Inhald eines DBGrid nach Excel exportieren ?
Hai,
grundsätzlich würde ich nicht aus einem DBGrid exportieren sondern aus einem TDataSet. Das ist dann doch viel flexibler. Eine 10 sekündige Suche in der DP hat mich zum Beispeil zu diesem ![]() ![]() Aber das alles hat nur Sinn wenn man den Code auch versteht und nicht einfach nur kopiert ;-) |
Re: Inhald eines DBGrid nach Excel exportieren ?
Obwohl ich Sharky's Meinung bin, das Ein DBGrid nur zur Anzeige dient und Manipulationen, Export usw. immer an der dahinterliegende Datenmenge durchgeführt werden sollte, hier noch ne Möglichkeit für das Grid. In JVCL gibt es verschiedene Kompos um aus einem Grid zu exportieren z.B. TJvDBGridExcelExport. Möglicherweise benötigst du dann aber das Jedi DBGrid.
|
Re: Inhald eines DBGrid nach Excel exportieren ?
BTW:
Wenn in der Exceldatei (.xls) nicht irgendwelche Formeln hinterlegt sind kannst Du das ganze doch einfach in eine .CSV schreiben und diese dann mit Excel öffnen. |
Re: Inhald eines DBGrid nach Excel exportieren ?
Desweiteren kann man einen ADO-Connectionstring erstellen:
Code:
Allerdings muss dann die Datei existieren. Es kann sein, das die Jet-Engine Tabellen erzeugen kann ('Create Table ...'), das hab ich aber noch nicht ausprobiert.
"Provider=MSDASQL.1;Persist Security Info=False;Data Source=Excel-Dateien;Initial Catalog=C:\MyExcelExport"
Excel per OLE die Arbeit erledigen zu lassen ist bequem, aber unglaublich langsam. Besser CSV (wenn das Layout keine Rolle spielt) oder eben eine der Freeware Excel-Export-Tools. |
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo sharky
habe den thread von kosch andreas angeschaut, der basiert aber auf ADOkomponenten, ich habe aber BDEkomponenten ( Query mit Datasource in meinen Projekt ) du schreibst : Zitat:
hallo mkinzler, du schreibst: Zitat:
nicht laufen, und ich werde mir das nicht mehr antun das zu versuchen !! kann man eine einzelen jedikomponente auch so auf mein d6 installieren ? hallo omata mit der ersten variante komme ich nicht klar, da fehlt mir der durchblick mit der zweiten variante , da sollte MSQuery installiert sein, da weiß ich auch nicht weiter funktioniert bei dir die dritte variante mit meinen aufruf der prozedure ? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Zitat:
Diese kann ganz einfach in Excel geladen und als xls gespeicher werden. Diese erhältst du einfach in dem du die Felder nacheinander in eine Textdatei schreibst und dazwischen jeweils ein Semikolon setzt.
Delphi-Quellcode:
zeile := query.Fields.FieldByNumber(0).asString;
for i := 1 to Query.Fields.Count-1 do begin Zeile := zeile + '; ' + query.Fields.FieldByNumber( i).asString; end; Zitat:
|
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo,
jetzt habe ich so viele möglichkeiten aber nirgenswo komme ich weiter, habe das 2 beispiel von omata probiert,
Delphi-Quellcode:
uses ... OleServer, Excel2000 ...
: : var Excel:TExcelApplication; lcid:integer; Workbook:_Workbook; Query, Range, Sheet:Variant; User, Database, ODBCname:string; begin Excel:=TExcelApplication.Create(Self); try lcid:=GetUserDefaultLCID; Excel.Connect; Excel.Visible[lcid] := true; Excel.UserControl := true; Workbook:=Excel.Workbooks.Add(EmptyParam, LCID); User:='ich'; ODBCname:='LocalServer'; Database:='MeineDatenbank'; Sheet:=Workbook.ActiveSheet; Range := Excel.Cells.Range['A1', 'A1']; Query:=Sheet.QueryTables.Add( 'ODBC;' + 'DSN=' + ODBCname + ';' + 'UID=' + User + ';' + 'APP=Microsoft® Query;' + 'DATABASE=' + Database + ';' + 'Trusted_Connection=Yes', Range ); Query.CommandText:='SELECT * FROM tabelle'; Query.Name:= 'Meine Abfrage von LocalServer'; Query.FieldNames := True; Query.RowNumbers := False; Query.FillAdjacentFormulas := False; Query.PreserveFormatting := True; Query.RefreshOnFileOpen := False; Query.BackgroundQuery := True; Query.RefreshStyle := xlInsertDeleteCells; Query.SavePassword := True; Query.SaveData := True; Query.AdjustColumnWidth := True; Query.RefreshPeriod := 0; Query.PreserveColumnInfo := True; Query.Refresh(False); finally Excel.Disconnect; Excel.free; end; end; muß ich bei den codezeilen an mein projekt anpassen ?
Delphi-Quellcode:
User:='ich';
ODBCname:='LocalServer'; Database:='MeineDatenbank'; und Query.CommandText:='SELECT * FROM tabelle'; Query.Name:= 'Meine Abfrage von LocalServer'; es wird beim ausführen eine excelmappe geöffnet,und dann kommt ein fenster wo steht datenquelle auswählen, welche muß ich auswählen ? und es kommt der fehler: Allgemeiner ODBC FEHLER !!! mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo vader, wie du selbst bemerkt hast, arbeitet das Bsp-Programm mit Ado-Komponenten, deines ab mit Bde-Komponeneten, also mußt du nur alles was mt Ado zu tun hat, mit der BDE-Variante ersetzen.
|
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo mkinzler,
und wie soll das ausschauen, weches muß ich mit welchem ersetzten ? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Hallo Vader,
Zitat:
Zitat:
Da du ja mit der BDE arbeitest, bin ich davon ausgegangen, dass du auch eine TDatabase-Komponente benutzt. Dort gibst du ja auch einen ODBC-Namen an. Diesen benötigt auch Excel. Also Neue Abfrage erstellen, dann geht die MSQuery auf und du kannst dort dann deinen ODBC-Alias auswählen. Danach werden dir die Tabellen angezeigt. Wähle einfach mal eine aus, füge sie hinzu und geh auf schliessen. Dann ziehst du den * ins untere Grid und siehst den Inhalt der Tabelle. Über Daten->Daten an Excel zurückgeben werden die Daten an Excel übergeben. Dies ist nur ein Test und zeigt dir schonmal, wie man das normalerweise macht. Wenn das alles soweit geht, dann sollte auch die Fernsteuerung des Ganzen eigentlich gehen. Zitat:
Zitat:
Also User ist der User in der Datenbank (Berechtigungen), ODBCname ist dein ODBC-Alias, der zu der Datenbank führt. Database ist der Name deiner Datenbank. Query.CommandText muss die SQL-Abfrage enthalten, das ist die die auch dein DBGrid mit Inhalt füllt. Query.Name ist unwichtig, nur eine Spielerei. Ich sehe gerade das ich nicht an ein Passwort gedacht habe. Ist deine Datenbank mit einem Passwort gesichert? Wenn ja, muss einfach noch Password=??? hinter den User im Connection-String. Ich musste gerade feststellen, dass das bei mir so auch nicht geht. Ich bekomme als eingeschrängter Benutzer auch einen allgemeinen ODBC-Fehler. Also probiere es mal als Administrator. Das ist dann allerdings keine schöne Lösung. Da wäre wohl eine ordentliche Datenbank sinnvoller... @mkinzler: mein Vorschlag arbeitet nicht mit ADO-Komponenten. MfG Thorsten |
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo omata,
das muß ich jetzt einmal verdauen,aber die dritte variante von dir würde mir genau passen, weill ich ganz kleine datenbanken habe und nicht viel zum auslesen, aber es kommt bei excel nichts an, du hast geschrieben, ich sollte mal debuggen und das ist leider auch etwas was ich nie mache, aber ich habe es probiert, und ich bleibe im der while - schleife hängen !!!
Delphi-Quellcode:
while (j <= 26) and not abbruch do begin
i:=1; while (i <= 26) and not abbruch do begin if j = 0 then Result[x]:=chr(i+64) else Result[x]:=chr(j+64)+chr(i+64); inc(i); inc(x); abbruch:=(x > 256); end; inc(j); end; ist das der fehler bei der function CreateSpalten:TSpalten; ??? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Naja, die Schleife läuft bis x > 256. Das kann im Einzelschrittmodus etwas länger dauern. Überspringe doch CreateSpalten mit F8.
|
Re: Inhald eines DBGrid nach Excel exportieren ?
ok, mit F8 bin daraus gekommen, aber jetzt stecke ich hier fest auch mit F8
Delphi-Quellcode:
for i:=1 to DBGrid.FieldCount do begin
Inhalt:=DBGrid.DataSource.DataSet.FieldByName( DBGrid.Fields[i-1].FieldName ).AsString; Zelle:=Excel.Cells.Range_[ Spalten[i+StartSpalte-1]+inttostr(Zeile), Spalten[i+StartSpalte-1]+inttostr(Zeile) ]; Zelle.Value:=Inhalt; end; ist dort der fehler ??? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Was soll ich dazu sagen? Bei mir funktioniert das...
Ist den FieldCount > 0? |
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo,
bin dort auch rausgekommen,wo kann ich da nachschauen ob FieldCount > 0 ist ? mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo,
könnte wer den code propieren ob der bei euch funktioniert !!
Delphi-Quellcode:
procedure DBGridToExcel(DBGrid:TDBGrid; StartSpalte, StartZeile:integer);
type TSpalten = array[1..256] of string; function CreateSpalten:TSpalten; var i, j, x:integer; abbruch:boolean; begin x:=1; abbruch:=false; j:=0; while (j <= 26) and not abbruch do begin i:=1; while (i <= 26) and not abbruch do begin if j = 0 then Result[x]:=chr(i+64) else Result[x]:=chr(j+64)+chr(i+64); inc(i); inc(x); abbruch:=(x > 256); end; inc(j); end; end; var Excel:TExcelApplication; i, Zeile, lcid:integer; Workbook:_Workbook; Sheet, Zelle, Inhalt:Variant; Spalten:TSpalten; begin if assigned(DBGrid) and assigned(DBGrid.DataSource) and assigned(DBGrid.DataSource.DataSet) then begin if DBGrid.DataSource.DataSet.Active then begin Excel:=TExcelApplication.Create(nil); try lcid:=GetUserDefaultLCID; Excel.Connect; Excel.Visible[lcid]:=true; Excel.UserControl:=true; Workbook:=Excel.Workbooks.Add(EmptyParam, lcid); Spalten:=CreateSpalten; Zeile:=StartZeile; for i:=1 to DBGrid.FieldCount do begin Inhalt:=DBGrid.Fields[i-1].DisplayName; Zelle:=Excel.Cells.Range[ Spalten[i+StartSpalte-1]+inttostr(Zeile), Spalten[i+StartSpalte-1]+inttostr(Zeile) ]; Zelle.Value:=Inhalt; Zelle.Font.Bold:=true; end; DBGrid.DataSource.DataSet.First; while not DBGrid.DataSource.DataSet.Eof do begin inc(Zeile); for i:=1 to DBGrid.FieldCount do begin Inhalt:=DBGrid.DataSource.DataSet.FieldByName( DBGrid.Fields[i-1].FieldName ).AsString; Zelle:=Excel.Cells.Range[ Spalten[i+StartSpalte-1]+inttostr(Zeile), Spalten[i+StartSpalte-1]+inttostr(Zeile) ]; Zelle.Value:=Inhalt; end; DBGrid.DataSource.DataSet.Next; end; Sheet:=Workbook.ActiveSheet; Sheet.Columns[ Spalten[StartSpalte]+':'+Spalten[StartSpalte+DBGrid.FieldCount] ].EntireColumn.AutoFit; finally Excel.Disconnect; Excel.free; end; end; end; end; aufruf
Delphi-Quellcode:
mfg vader
DBGridToExcel(DBGrid, 1, 1);
|
Re: Inhald eines DBGrid nach Excel exportieren ?
hallo,
kann keiner das testen :( mfg vader |
Re: Inhald eines DBGrid nach Excel exportieren ?
Hallo !
DBGridToExcel funktioniert einwandfrei ! Ich hab nur festgestellt, daß in Delphi 5 die Property Range_ und nicht Range heisst. Danke ! Gruß Elkos |
Re: Inhald eines DBGrid nach Excel exportieren ?
Hallo allerseits,
also bei mir kommt beim Ausführen der Procedure ... "DBGridToExcel(DBGrid,1,1);" .... die Fehlermeldung: --------------------------- Project1 --------------------------- Klasse nicht registriert. --------------------------- OK --------------------------- und zwar an der Stelle
Delphi-Quellcode:
Und das obwohl ich die Units (OleServer, ExcelXP und/oder Excel2000) mit in die Uses aufgenommen habe.
.
. . Excel.Connect; . . . Hat jemand eine Idee was ich falsch mache? |
Re: Inhald eines DBGrid nach Excel exportieren ?
Ohh mein Gott ... sorry eure Zeit gestohlen zu haben. Ob ich an diesem Rechner wohl mit OO arbeite und somit gar kein MS Excel installiert habe ?!!! :wall:
.. sowas ist mir noch nie passiert :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz