Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi schneller Zugriff auf Excel-Zellen (>10 000 Zellen) (https://www.delphipraxis.net/116367-schneller-zugriff-auf-excel-zellen-10-000-zellen.html)

DelphiManiac 27. Jun 2008 14:32


schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
Hallo,

ich versuche gerade einen Excelexport zu erstellen.

Meine Anwendung erzeugt Datensätze und die sollen in eine Excelvorlage geladen und unter anderem Namen abgespeichert werden...

Leider stellt sich der Zugriff so wie ihn jetzt habe als seeeeehr langsam heraus, gibt es dan eine andere Möglichkeit,
die effizienter ist?

Delphi-Quellcode:
unit uExcelExport;

interface

uses Variants,ExcelXP;

type
   TExcelExport = class(TObject)
   private
    FLocaleIdentifier: Integer;
     { private-Deklarationen }
   protected
     { protected-Deklarationen }
   public
     { public-Deklarationen }
      FExcel:TExcelApplication;
      FExcelWB:_Workbook;
      FExcelWS:_Worksheet;

      procedure OpenVorlage(Pfad:string);
      procedure ExportToExcel(DateiName:string);
      constructor Create;
   published
     { published-Deklarationen }
   end;

implementation

uses
  Windows, SysUtils;

{ TExcelExport }

constructor TExcelExport.Create;
begin
  FExcel := TExcelApplication.Create(nil);
//  FExcelWB := TExcelWorkbook.Create( nil );
//  FExcelWS := TExcelWorksheet.Create( nil );
 // Get current user locale ID
  FLocaleIdentifier := GetUserDefaultLCID();


end;

procedure TExcelExport.ExportToExcel(DateiName: string);
var
  I: Integer;
begin
  FExcelWB:=FExcel.Workbooks.Item[1];
  FExcelWS:=FExcelWB.Worksheets.Get_Item(1) as _Worksheet;
  for I := 1 to 1000 - 1 do
    FExcelWS.Cells.Item[i+2,1]:='Test '+IntToStr(i) ;
  FExcelWB.SaveCopyAs(DateiName,FLocaleIdentifier);

end;

procedure TExcelExport.OpenVorlage(Pfad: string);

begin
  FExcel.Connect;
  FExcel.Workbooks.Open('template.xls', False, False, EmptyParam, '', False, False, EmptyParam, EmptyParam, false, false, EmptyParam, EmptyParam, EmptyParam, false, 0);
  FExcel.Visible[FLocaleIdentifier]:=True;
end;

end.
Vielen Dank!

Gruber_Hans_12345 27. Jun 2008 14:35

Re: schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
ich habe es mal über die zwischenablage gemacht (mit #9/#13 usw die felder trennen) alles in einen string -> in die zwischenablage, und vom excel wieder aus der zwischenablage auslesen, das verkürzt die zeit auch extrem.

Oder du schaust dir externe Komponenten an, die direkt Excel File erzeugen können (ohne Excel) zb SMExport
oder ein CSV erzeugen, und dann Excel dieses aufmachen lassen, und als XLS speichern ...

mkinzler 27. Jun 2008 14:38

Re: schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
Man könnte auch per ADO auf Excel zugreifen oder über CSV

Bernhard Geyer 27. Jun 2008 14:39

Re: schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
Du mußt die das gesamte ausgefüllte Sheet als VariantArray (über Ranges) geben lassen. Das ganze OLE-Calling bremst ohne Ende.
Ich kann dir jedoch keinen Quellcode geben da ich hier die TMS-Komponenten verwende die sowas implementiert haben.

DelphiManiac 27. Jun 2008 14:41

Re: schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
Ich würde die Daten sowieso gerne erst als csv in eine/oder mehrere Temporärdateien speichern,
und dann ein Import in die Vorlage machen, diese dann unter anderem Namen abspeichern.

Wäre das ein "schnellerer" Weg die Daten ins Excel zu schieben, wenn ja wie importiert man in Delphi
CSV-Dateien in Excel??

Danke euch!

mkinzler 27. Jun 2008 14:43

Re: schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
Man kann das per COM-Fernsteuerung Laden

toms 27. Jun 2008 14:45

Re: schneller Zugriff auf Excel-Zellen (>10 000 Zellen)
 
Zitat:

Zitat von Bernhard Geyer
Du mußt die das gesamte ausgefüllte Sheet als VariantArray (über Ranges) geben lassen.

Ein Beispiel findes du hier: Fast data transfer to MS Excel (VarArrayCreate)

Andere Möglichkeit: Ohne OLE / ADO etc. - via "native" Zugriff. Beispiele sind in der DP / Google zu finden.


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