Einzelnen Beitrag anzeigen

omata

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

Re: Makro in Excel ausführen

  Alt 1. Jul 2006, 00:54
Und direkt in ein Grid geht es z.B. so...

Delphi-Quellcode:
procedure CSVtoStringGrid(Dateiname:string; StringGrid:TStringGrid);
var Datei:textfile;
    Zeilen, posi, ErsteZeile, ErsteSpalte, x, xmax, y, Breite:integer;
    Spalte, Zeile, s:string;
begin
  if assigned(StringGrid) then begin
    ErsteZeile:=StringGrid.FixedRows;
    ErsteSpalte:=StringGrid.FixedCols;
    StringGrid.RowCount:=StringGrid.FixedRows+1;
    Zeilen:=StringGrid.RowCount-1;
    Breite:=StringGrid.ColCount-1;
    y:=ErsteZeile;
    xmax:=0;
    assignfile(Datei, Dateiname);
    try
      reset(Datei);
      while not eof(Datei) do begin
        readln(Datei, Zeile);
        if y > Zeilen then begin
          StringGrid.RowCount:=StringGrid.RowCount+1;
          Zeilen:=StringGrid.RowCount-1;
        end;

        Zeile:=Zeile+';';
        s:=Zeile;
        x:=ErsteSpalte;
        repeat
          posi:=pos(';', Zeile);
          if posi > 0 then
            Spalte:=copy(Zeile, 1, posi-1);
          delete(Zeile, 1, posi);

          if x > Breite then begin
            StringGrid.ColCount:=StringGrid.ColCount+1;
            Breite:=StringGrid.ColCount-1;
          end;
          StringGrid.Cells[x, y]:=Spalte;
          inc(x);
          if x > xmax then
            xmax:=x;
        until (posi = 0) or (Zeile = '');
        inc(y);
      end;
      if StringGrid.RowCount > y then
        StringGrid.RowCount:=StringGrid.RowCount - (StringGrid.RowCount - y);
      if StringGrid.ColCount > xmax then
        StringGrid.ColCount:=StringGrid.ColCount - (StringGrid.ColCount - xmax);
    finally
      closefile(Datei);
    end;
  end;
end;
Aufruf...
  CSVtoStringGrid('Mappe.csv', StringGrid); Test: ~23MB / 17000 Zeilen, 256 Spalten in 23 Sekunden.
Das Einlesen und erstellen des Gridbereiches dauert eigentlich nur 5 Sekunden (so schnell ist bei mir auch Excel), wurde allerdings auf 23 Sekunden erhöht, durch den Zugriff auf Cells. Da das alles private Elemente im Grid sind, die da aufgerufen werden konnte ich da leider noch keine weitere Optimierung einbauen.
Auch das Umschalten der Zeichenroutine oder das unsichbarmachen des Grids ergab keinen Geschwindigkeitszuwachs.

Edit:
Der Ansatz von Amateurprofi ist sogar noch etwas schneller (~19 Sekunden), allerdings wird die letzte Spalte nicht mit importiert (c mit 1 initialisieren, dann gehts)

Gruss
Thorsten
  Mit Zitat antworten Zitat