Einzelnen Beitrag anzeigen

pertzschc

Registriert seit: 29. Jul 2005
Ort: Leipzig
316 Beiträge
 
Delphi 12 Athens
 
#1

Laufzeit Excelzugriff extrem langsam

  Alt 25. Mär 2025, 14:35
Datenbank: MS Excel • Version: 2024 • Zugriff über: OleVariant
Hallo in die Runde,
ich schreibe in einer Schleife eine Menge von Excelfiles, worin sich immer x-Datenzeilen befinden und z.B. durch laufende Zähler über alle Files zu einander gehören.
Ich benutze aktuell folgendes Coding zum Befüllen der Exceldateien:
Delphi-Quellcode:
procedure TForm1.TestCases_UploadFiles_SaveFiles;
var
  excel_obj_src: OleVariant;
  excel_obj_tar, WS: OleVariant;
  zeile, spalte: integer;
  strValue, fileNameTemp, fileNameBase, fileNameExt: string;
  directory, filename, fromFile, toFile: String;
  tcCnt, tcNum, fiCnt, ActCnt, ActioCnt, aa, bb, cc, dd, i: integer;
  tempBPTestCase: TTestCase;
  tempTCActivity: TTCActivity;
  tempTCAction: TTCAction;
begin
  fileNameTemp := ExtractFileName(self.sFileName);
  fileNameExt := ExtractFileExt(fileNameTemp);
  fileNameBase:= System.IOUtils.TPath.GetFileNameWithoutExtension(fileNameTemp);
  self.StatusBar1.SimplePanel := true;
  self.StatusBar1.SimpleText := ' Schreibe Daten...';
  self.ProgressBar2.Visible := true;
  self.ProgressBar2.Enabled := true;
  self.ProgressBar2.Position := 0;

  // anzahl files
  fiCnt := StrToInt(self.edtCntFiles.Text);
  tcCnt := StrToInt(self.edtCntTestCases.Text);
  if fiCnt <> 0 then
  begin
    tcNum:=0;
    // schleife über die files
    for aa := 1 to fiCnt do
    begin
      SetProgressBar2(aa,fiCnt);
      fromFile := GetDirDesktop() +
        '\testdata\UploadTemplate.xlsx';
      filename := fileNameBase + '__'+FormatWithLeadingZero(4, tcCnt)+'TC'+ '__' + FormatWithLeadingZero(4, aa)+fileNameExt;
      directory := GetDirDesktop() + '\testdata\gen';
      ErstelleDir(directory);
      toFile := directory + '\' + filename;
      System.IOUtils.TFile.Copy(fromFile, toFile, true);
      if System.SysUtils.FileExists(toFile) then
      begin
        try
          excel_obj_tar := CreateOleObject('Excel.Application');
          excel_obj_tar.Workbooks.Open(toFile);
          WS := excel_obj_tar.Worksheets.Item['Test Cases'];
          WS.Activate;
          // lstTestCases.Clear;
          if lstTestCases.Count > 0 then
          begin
            tempBPTestCase := TTestCase(lstTestCases.Items[0]);
          end;
          if tempBPTestCase <> nil then
          begin
            zeile := 2;
            // schleife über test case anzahl
            for bb := 1 to tcCnt do
            begin
              tcNum:=tcNum+1;
              // test case daten
              strValue := FormatWithLeadingZero(4, tcNum) + ' - ' +
                tempBPTestCase.Test_Case_Name;
              WS.Cells.Item[zeile, 1].Value := strValue;
           // hier werden weitere Spalten mit Daten gefüllt.
              zeile := zeile + 1;
              excel_obj_tar.ActiveWorkbook.Save;
            end;
          end;
        finally
          if not VarIsEmpty(excel_obj_tar) then
          begin
            excel_obj_tar.DisplayAlerts := false;
            excel_obj_tar.ActiveWorkbook.Save;
            excel_obj_tar.ActiveWorkbook.Close;
            excel_obj_tar.Quit;
          end;
        end;
      end;
    end;
  end;
end;
Das Coding selber ist relativ schnell durchlaufen (ca. 30sec.) und anschließend schreibt mein Programm noch weiter die eigentlichen Files (ca. 5-10 min.).
Kann ich daran etwas beschleunigen?
Viele Grüße, Christoph

Geändert von pertzschc (25. Mär 2025 um 14:59 Uhr)
  Mit Zitat antworten Zitat