Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Daten von StringGrid als .xls (https://www.delphipraxis.net/36126-daten-von-stringgrid-als-xls.html)

recordable 16. Dez 2004 09:20


Daten von StringGrid als .xls
 
Hallo!
Ich möchte Daten aus einem StringGrid als .xls Datei in einem beliebigen Verzeichnisse speichern. Mit Dialog öffnen usw.
Kann mir einer helfen?

MfG

Jens Schumann 23. Dez 2004 19:18

Re: Daten von StringGrid als .xls
 
Hallo,
evt kannst Du ja den Source auf Dein Problem übertragen.
In dem Source wird wird der Inhalt eines ADO-Recordsets über ein VARARRAY nach Excel
geschoben. Das geht für OLE Verhältnisse knallschnell!!!
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ADODB25_TLB, Excel2000, OleServer, StdCtrls, ExcelXP;

type
  TFormQuery = class(TForm)
    ExcelApplication: TExcelApplication;
    ExcelWorksheet: TExcelWorksheet;
    ExcelWorkbook: TExcelWorkbook;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FLCID            : Integer;
    FConnectionString : String;
    procedure CloseExcel;
    procedure OpenExcel;
  public
    { Public-Deklarationen }
  end;

var
  FormQuery: TFormQuery;

implementation

{$R *.dfm}


resourcestring
  ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%sTest.mdb;Persist Security Info=False';


{ TFormQuery }

procedure TFormQuery.FormCreate(Sender: TObject);
begin
  FLCID:=GetUserDefaultLCID;
  FConnectionString:=Format(ConnectionString,[ExtractFilePath(ParamStr(0))]);
end;

procedure TFormQuery.OpenExcel;
begin
  ExcelApplication.Connect; // Stelle Verbindung zu Excel her
  ExcelApplication.Visible[FLCID] := False; // Starte Excel unsichtbar
  ExcelApplication.UserControl:= False; // UserControl muss immer syschron zu Visible gesetzt werden
  ExcelApplication.DisplayAlerts[FLCID]:=False; // Unterdrücke alle Fehlermeldungen von Excel
end;

procedure TFormQuery.CloseExcel;
begin
  ExcelWorksheet.Disconnect;
  ExcelWorkbook.Disconnect;
  ExcelApplication.Quit;
  ExcelApplication.Disconnect;
end;


procedure TFormQuery.Button1Click(Sender: TObject);
{
 Achtung: Das Array wird über ArrV[Row,Col] (also ArrV[Y,X]) angesprochen,
          weil Excel in den Zellbezüge auch ...[Row,Col] erwartet !!!!!!!!!!
}
var
  Con        : Connection; // natives ADO-ConnectionObjekt
  Rs         : RecordSet; // natives ADO-RecordsetObjekt
  ArrV       : Variant; // Dies ist das variante Array
  Col        : Integer;
  Row        : Integer;
  Cell       : Range;
  RecordCount : Integer; // Anzahl der Datensätze
  FieldsCount : Integer; // Anzahl der Spalten (Felder)
begin
  Screen.Cursor:=crHourGlass;
  Col:=0;
  Row:=0;
  Con:=CoConnection.Create;
  RS:=CoRecordSet.Create;
  Try
    RS.CursorLocation:=adUseClient; // nur mit adUseClient ist die RecordCount Property gültig
    Con.Open(FConnectionString,'','',-1); // Öffne die Verbindung zur Datenbank
    RS.Open('SELECT * FROM daten',Con,adOpenForwardOnly,adLockReadOnly,adCmdTableDirect);
    // Initialisiere ein zweidimensionales Array mit [Anzahl der Datensätze,Anzahl der Spalten]
    RecordCount:=RS.RecordCount;
    FieldsCount:=RS.Fields.Count;
    ArrV:=VarArrayCreate([0,RecordCount-1,0,FieldsCount-1],varVariant);
    VarArrayLock(ArrV);
    While Not RS.EOF do
      begin
      For Col:=0 to FieldsCount-1 do
        ArrV[Row,Col]:=RS.Fields.Item[Col].Value;
      Inc(Row);
      RS.MoveNext;
      end; // While Not RS.EOF do
    VarArrayUnLock(ArrV);
    OpenExcel; // Öffne jetzt Excel
    Try
      ExcelApplication.Workbooks.Open(ExtractFilePath(ParamStr(0))+'Test.xls',EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,FLCID);
      ExcelWorkbook.ConnectTo(ExcelApplication.Workbooks.Item['Test.xls']);
      ExcelWorkSheet.ConnectTo(ExcelWorkbook.Sheets.Item['Tabelle1'] as _WorkSheet);

      Cell:=ExcelWorkSheet.Cells.Range_['B2','B2']; // legt die linke obere Ecke der Tabelle fest
      ExcelWorkSheet.Range[Cell,Cell.Offset[RecordCount-1,FieldsCount-1]].Value:=ArrV; // Übertrage Daten nach Excel

      ExcelWorkbook.Save;
    Finally
      CloseExcel;
      end;
  Finally
    RS:=Nil;
    Con.Close;
    Con:=Nil;
    Screen.Cursor:=crDefault;
    end;
end;

end.
RS ist das ADO-Recordset. In Deinem Fall wäre es das TStringGrid. D.h. erzeuge
ein 2D VARARRAY (wie oben). Schreibe die Inhalt des TStringGrid in das VARARRAY und schiebe
dieses anschließend nach Excel.
Ach ja - Der Source geht davon aus, dass es im Programmverzeichnis eine Exceldatei mit dem
Namen Test.xls gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 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