![]() |
Datenbank: MS SQL • Version: 200 • Zugriff über: ADO
Excel Export part 2
Hallo,
wieder eine Frage zum Thema ExcelExport: ich weiß nicht, ob es irgendwie besser oder einfacher geht: Prinzipiell möchte ich möglichst schnell die Daten aus meiner SQL-Tabelle in ein Excel-File oder Excel selbst exportieren. Jetzt hatte ich folgende Funktion genutzt, die auch nur suboptimal funktioniert:
Delphi-Quellcode:
Wenn OrgLen > 255 ist, dann ist die NewLen immer 255 und die restlichen Zeichen werden abgeschnitten.procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string); var i : integer; ADOCon : TAdoConnection; Qu1 : TAdoQuery; begin AdoCon:= TAdoConnection.Create(nil); AdoCon.LoginPrompt := False; AdoCon.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source='+ FileName + ';Extended Properties=Excel 8.0'; Qu1:= TAdoQuery.Create(nil); Qu1.Connection := AdoCon; Qu1.SQL.Text := 'Select * from ['+ SheetName +'$]'; Qu1.Open; try with DBGrid.DataSource.DataSet do begin First; while not eof do begin Qu1.Append; with DBGrid.Columns do begin Qu1.Edit; for i:= 0 to Count-1 do if Items[i].visible then begin Qu1.FieldByName(Items[i].Title.Caption).AsString:= FieldByName(Items[i].FieldName).AsString; ShowMessage ('OrgLen: '+ IntToStr ( length (FieldByName(Items[i].FieldName).AsString))+' '+#13#10+ 'NewLen: '+IntToStr ( length ( Qu1.FieldByName(Items[i].Title.Caption).AsString))); end; Qu1.Post; end; Next; end; end; Hat jemand eine Idee, was man da machen könnte? Danke Tim |
Re: Excel Export part 2
Hallo,
Aber was ist das genauer?
Delphi-Quellcode:
Qu1 ist der Inhalt die Exceltabelle?
Qu1.FieldByName(Items[i].Title.Caption).AsString:= FieldByName(Items[i].FieldName).AsString;
Dort wird der Spalte mit dem Namen "Items[i].Title.Caption" der Inhalt der Datenbanktabelle hinter dem Dataset mit dem gleichen Namen zugewiesen, das heißt doch, in Excel kommen nur 255 Zeichen an, auch wenn mehr geliefert wird. Schaumal bitte, was dabei rauskommt:
Delphi-Quellcode:
Stimmt das mit dem Erwarteten überein, oder ist die Spalte in der Exceltabelle wirklich nur 255 Zeichen.
s := '';
for i := 0 to Qu1.Fields.Count do begin s := s + Qu1.Fields[i].Name + '=' + IntToStr(Qu1.Fields[i].Size) + #13; end; ShowMessage(s); Stephan PS: Früher hatte ich mal das Problem, dass dbase-Tabellen, mit Excel geöffnet und dann gespeichert nach dem Speichern eine andere Tabellendefinition hatten als vorher. Die Größe von Strings war abhängig von der sichtbaren Spaltenbreite in Excel. Gibt es das Phänomen immer noch? |
Re: Excel Export part 2
Ja, das heisst das bei dieser Zuweisung
Delphi-Quellcode:
nur 255 Zeichen aufgenommen werden. (wird durch deinen Code nochmal bestätigt; kommt überall 255 raus)
Qu1.FieldByName(Items[i].Title.Caption).AsString
Aber warum? ...und kann man das ändern? Danke Tim |
Re: Excel Export part 2
Danke für deinen Hilfe, hab es jetzt gefunden:
weiter oben hatte ich anstatt "adLongVarWChar" adVarWChar und das lässt scheinbar nur 255 Zeichen zu.
Delphi-Quellcode:
with DBGrid.Columns do begin
for i:= 0 to Count-1 do if items[i].Visible then begin col:= nil; col:= CoColumn.Create; with col do begin Set_Name(Items[i].Title.Caption); ft:= DBGrid.DataSource.DataSet.Fields[i].DataType; sft:= GetEnumName(TypeInfo(TFieldType), Integer(ft)); if sft='ftAutoInc' then Typ:= adInteger else Typ:= adLongVarWChar; Set_Type_(Typ); // adVarWChar end; // add column to table tbl.Columns.Append(col, adVarWChar, 20); end; end; |
Re: Excel Export part 2
Zitat:
Delphi-Quellcode:
Aufruf...
procedure SQLToExcel(DSN, einfuegeFeld, SQLtext:string; Verbindung:boolean);
function Computername: string; var Buffer: PChar; BufSize: DWord; begin Buffer := StrAlloc(256); BufSize := 255; if GetComputerName(Buffer, BufSize) then Computername := Buffer else Computername := ''; StrDispose(Buffer); end; function Username: string; var Buffer: PChar; BufSize: DWord; begin Buffer := StrAlloc(256); BufSize := 255; if GetUserName(Buffer, BufSize) then Username := Buffer else Username := ''; StrDispose(Buffer); end; var Connection:string; pause, Sheet:variant; i:word; fehler:boolean; flcid:Cardinal; Excel:TExcelApplication; begin flcid:=Windows.GetUserDefaultLCID; fehler:=false; Excel:=TExcelApplication.Create(nil); try try Excel.Connect; except raise Exception.Create('Auf diesem Rechner ist kein Excel installiert.'); fehler:=true; end; if not fehler then begin Excel.Visible[flcid]:=true; Excel.Workbooks.Add(emptyParam, flcid); Sheet:=Excel.ActiveSheet as _WorkSheet; Connection:= 'ODBC;' + 'DSN=' + DSN + ';' + 'Description=Test;' + 'UID=' + Username + ';' + 'APP=Microsoft® Query;' + 'WSID=' + Computername + ';' + 'Trusted_Connection=Yes'; pause:=false; Sheet.QueryTables.add( Connection, Sheet.Range[einfuegeFeld], SQLtext ).Refresh(pause); if not Verbindung then for i:=Sheet.QueryTables.count downto 1 do Sheet.QueryTables[i].Delete; Excel.Disconnect; end; finally Excel.free; end; end;
Delphi-Quellcode:
procedure TForm.ButtonClick(Sender: TObject);
begin SQLToExcel('localserver', 'A1', 'SELECT * FROM tabelle', false); end; |
Re: Excel Export part 2
super, dankeschön
|
Re: Excel Export part 2
Eine Frage zum letzten alternativen source noch:
Ist es gewollt, dass sich in Excel ein "Datenquelle auswählen" Fenster öffnet? So ganz ist mir die Intention von DSN noch nicht klar, muss diese erst erstellt werden oder ist das der Servername, der auch im Enterprise Manager steht? |
Re: Excel Export part 2
Nein, es ist nicht gewollt, dass ein Fenster aufgeht. Aber hast du da mal deine Datenquelle ausgewählt? Dann hättest du schonmal erkannt was da passieren soll.
Das DSN = Data Source Name ist ein Benutzer- oder System-DSN, der im ODBC-Bereich konfiguriert werden muss. Das Beispiel zeigt dir, wie du Excel so fernsteuerst, dass es sich die Daten selbstständig aus einer Datenbank holt. Dies geschieht über die ODBC-Schnittstelle. Also schau mal unter Start->Einstellungen->Systemsteuerung->Verwaltung->Datenquellen (ODBC)->System-DSN und lege dir dort eine DSN auf deine Datenbank an. Wenn du da auf Hinzufügen gehst und deinen Servertyp (SQL Server) ausgewählt hast kannst du einen Verbindungsnamen (=DSN) angeben und einen Server (vermutlich local bei dir) auswählen. Dann auf weiter und du kannst die Anmeldung festlegen. Auf der dritten Seite ganz oben kannst du dann die Datenbank auswählen, mit der du dich innerhalb des angewählten Servers verbinden möchtest. Danach weiter und fertigstellen. Dann kannst du die Verbindung testen, fertig. In dem gezeigten Beispielcode kannst du dann diesen gerade angelegten DSN angeben. Da es dann den gewählten DSN gibt, sollte Excel kein Fenster für eine manuelle Auswahl öffnen und die Daten sofort anzeigen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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