AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel Export part 2

Ein Thema von Tim Henford · begonnen am 17. Sep 2008 · letzter Beitrag vom 18. Sep 2008
Antwort Antwort
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#1

Excel Export part 2

  Alt 17. Sep 2008, 13:46
Datenbank: MS SQL • Version: 200 • Zugriff über: ADO
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:

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;
Wenn OrgLen > 255 ist, dann ist die NewLen immer 255 und die restlichen Zeichen werden abgeschnitten.

Hat jemand eine Idee, was man da machen könnte?

Danke Tim
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: Excel Export part 2

  Alt 17. Sep 2008, 14:11
Hallo,

Aber was ist das genauer?
Qu1.FieldByName(Items[i].Title.Caption).AsString:= FieldByName(Items[i].FieldName).AsString; Qu1 ist der Inhalt die Exceltabelle?
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:
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);
Stimmt das mit dem Erwarteten überein, oder ist die Spalte in der Exceltabelle wirklich nur 255 Zeichen.

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?
  Mit Zitat antworten Zitat
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#3

Re: Excel Export part 2

  Alt 17. Sep 2008, 14:31
Ja, das heisst das bei dieser Zuweisung
Qu1.FieldByName(Items[i].Title.Caption).AsString nur 255 Zeichen aufgenommen werden. (wird durch deinen Code nochmal bestätigt; kommt überall 255 raus)
Aber warum? ...und kann man das ändern?

Danke Tim
  Mit Zitat antworten Zitat
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#4

Re: Excel Export part 2

  Alt 17. Sep 2008, 14:36
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='ftAutoIncthen Typ:= adInteger
          else Typ:= adLongVarWChar;

          Set_Type_(Typ); // adVarWChar
        end;
        // add column to table
        tbl.Columns.Append(col, adVarWChar, 20);
      end;
  end;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Excel Export part 2

  Alt 17. Sep 2008, 19:36
Zitat von Tim Henford:
Prinzipiell möchte ich möglichst schnell die Daten aus meiner SQL-Tabelle in ein Excel-File oder Excel selbst exportieren.
Delphi-Quellcode:
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;
Aufruf...
Delphi-Quellcode:
procedure TForm.ButtonClick(Sender: TObject);
begin
  SQLToExcel('localserver', 'A1', 'SELECT * FROM tabelle', false);
end;
  Mit Zitat antworten Zitat
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#6

Re: Excel Export part 2

  Alt 17. Sep 2008, 19:51
super, dankeschön
  Mit Zitat antworten Zitat
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#7

Re: Excel Export part 2

  Alt 18. Sep 2008, 10:13
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?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Excel Export part 2

  Alt 18. Sep 2008, 15:26
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 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