Announcement

Collapse
No announcement yet.

DBGRid nach Excel exportieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DBGRid nach Excel exportieren

    Hallo!
    Ich habe folgendes Problem!! Ich möchte Daten, die ich mir aus einer Tabelle selectiere und in einem DBGRid darstelle nach Excel exportieren. Wie kann ich den Inhalt des Grids exportieren?
    Vielen Dank im voraus! <P>

    Christian Venzke

  • #2
    Hallo,

    für diese Aufgabe gibt es verschiedene Optionen: <br>
    1. Microsoft EXCEL über Automation so fernbedienen, dass das eigene Programm die Daten einzeln in die Zelles des Excel-Sheets einträgt. <br>
    2. Microsoft EXCEL holt sich über <b>CopyFromRecordset</b> die Daten selbst aus der Datenbank:
    <pre>
    procedure TForm1.ButtonInsertClick(Sender: TObject);
    var
    aRS : _RecordSet;
    iCnt : Integer;
    i : Integer;
    aRange : Range;
    aField : Field;
    begin
    aRS := ADOTable1.Recordset;
    iCnt := aRS.Fields.Count;
    // Spaltenbeschriftung
    for i := 1 to iCnt do
    begin
    aRange := IDispatch(ExcelWorksheet1.Cells.Item[9,i]) as Range;
    aRange.Font.Bold := True;
    aField := aRS.Fields[i-1];
    aRange.Value := aField.Name;
    aRange.EntireColumn.ColumnWidth := aField.ActualSize;
    end;
    // Daten aus der ADO-Datenmenge kopieren
    ExcelWorksheet1.Range['A10','A10'].CopyFromRecordset(aRS,
    EmptyParam, EmptyParam);
    end;
    </pre&gt

    Comment


    • #3
      Hallo ! Vielen dank für die schnelle Antwort! Jedoch läuft der Quellcode nicht bei mir! Ich benutze Delphi 6 und Excel 2000 und als Betriebssystem Windows 2000. Sind da evtl. unterschiede?

      MfG
      Christian Venzk

      Comment


      • #4
        Hallo,

        ich habe gerade das Beispiel unter Windows 2000 Professional, Excel 2000 (SR-1) und Delphi 6 UpdatePack1 ausprobiert. Die Daten werden problemlos in das Excel-Sheet eingetragen. Um sicherzugehen, dass keine sonstigen Fehler gemacht wurden, füge ich das vollständige Programm bei:
        <pre>
        { ************************************************** **************
        Source File Name : D5E2KADOTestFrm.pas
        Typ : Formular-Unit
        Autor : Andreas Kosch
        Erstellt am : 04.05.2000
        Compiler : Delphi 5.01 (UpdatePack#1)
        Betriebssystem : Windows NT 4
        Beschreibung : Eine ADO-Datenmenge wird über Automation
        in ein Excel-Worksheet eingefügt.
        Revisionen : 19.02.2002 Test mit Delphi 6.01 unter Windows 2000 Prof.
        und Excel 2000 SR-1
        ************************************************** ************** }

        unit D5E2KADOTestFrm;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        Db, Grids, DBGrids, ADODB, ComCtrls, StdCtrls, Excel2000, OleServer;

        type
        TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADOTable1Name: TWideStringField;
        ADOTable1Capital: TWideStringField;
        ADOTable1Continent: TWideStringField;
        ADOTable1Area: TFloatField;
        ADOTable1Population: TFloatField;
        ButtonADO: TButton;
        ButtonExcel: TButton;
        ButtonInsert: TButton;
        ExcelApplication1: TExcelApplication;
        ExcelWorksheet1: TExcelWorksheet;
        ButtonExcelStop: TButton;
        ExcelWorkbook1: TExcelWorkbook;
        procedure ButtonADOClick(Sender: TObject);
        procedure ButtonExcelClick(Sender: TObject);
        procedure ButtonExcelStopClick(Sender: TObject);
        procedure ButtonInsertClick(Sender: TObject);
        private
        { Private-Deklarationen }
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        uses ADOInt, Variants;

        const
        cXLS_FileName = 'C:\Temp\Mappe1.xls';

        procedure TForm1.ButtonADOClick(Sender: TObject);
        begin
        ADOConnection1.Connected;
        ADOTable1.Open;
        end;

        procedure TForm1.ButtonExcelClick(Sender: TObject);
        begin
        ExcelApplication1.Connect;
        ExcelApplication1.Visible[GetUserDefaultLCID] := True;
        ExcelApplication1.UserControl := True;
        ExcelApplication1.Workbooks.Open(cXLS_FileName, False, False,
        EmptyParam,'',False,False,EmptyParam,
        EmptyParam,false,false,EmptyParam,false,0);
        ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveW orkBook);
        ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.It em[3] as
        _Worksheet);
        ExcelWorksheet1.Activate;
        end;

        procedure TForm1.ButtonInsertClick(Sender: TObject);
        var
        aRS : _RecordSet;
        iCnt : Integer;
        i : Integer;
        aRange : Range;
        aField : Field;
        begin
        aRS := ADOTable1.Recordset;
        iCnt := aRS.Fields.Count;
        // Spaltenbeschriftung
        for i := 1 to iCnt do
        begin
        aRange := IDispatch(ExcelWorksheet1.Cells.Item[9,i]) as Range;
        aRange.Font.Bold := True;
        aField := aRS.Fields[i-1];
        aRange.Value := aField.Name;
        aRange.EntireColumn.ColumnWidth := aField.ActualSize;
        end;
        // Daten aus der ADO-Datenmenge kopieren
        ExcelWorksheet1.Range['A10','A10'].CopyFromRecordset(aRS,
        EmptyParam, EmptyParam);
        end;

        procedure TForm1.ButtonExcelStopClick(Sender: TObject);
        begin
        ExcelWorksheet1.Disconnect;
        // Workbook ohne Speichern schliessen
        ExcelWorkbook1.Close(False);
        ExcelWorkbook1.Disconnect;
        // Excel beenden
        ExcelApplication1.Quit;
        ExcelApplication1.Disconnect;
        end;

        end.
        </pre>
        Das vollständige Programm und eine ausführliche Beschreibung ist in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> (Kapitel 12) zu finden

        Comment


        • #5
          Hallo Andreas,<br>leider <u>muß</u> ich Excel97 verwenden. Excel97 erwartet als Parameter für CopyFromRecordset ein DAO Objekt (im SDK nachgeschaut). Kann ich der Methode irgendwie ein ADO Objekt als DAO Objekt verkaufen

          Comment

          Working...
          X