AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Arbeiten mit Excel generiert *.tmp

Ein Thema von Moombas · begonnen am 24. Mär 2017 · letzter Beitrag vom 17. Mai 2017
Antwort Antwort
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 08:54
Da mein eigentliches Thema "Rahmen in Excel zeichnen" erledigt ist, mache ich für ein neues gravierendes Problem ein neues Thema auf:

Er generiert zur Laufzeit teilweise ettliche *tmp Dateien und ich finde die Ursache nicht, Vermute sie aber im Zusammenhang mit Excel, denn früher hatte ich solche Probleme nie (habe da nicht direkt mit einem externen Programm gearbeitet). Vielleicht hat jemand von euch eine Idee, falls das ganze Programm benötigt wird bescheid geben dann müsste ich mal schauen wegen Betriebsbezogener Daten:

Delphi-Quellcode:
//Excel einlesen
function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Create Excel-OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;
    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);
    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
    // In order to know the dimension of the WorkSheet, i.e the number of rows
    // and the number of columns, we activate the last non-empty cell of it
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Get the value of the last row
    x := XLApp.ActiveCell.Row;
    // Get the value of the last column
    y := XLApp.ActiveCell.Column;
    // Set Stringgrid's row &col dimensions.
    AGrid.RowCount := x;
    AGrid.ColCount := y;
    // Assign the Variant associated with the WorkSheet to the Delphi Variant
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    // Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
       AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;
  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      // XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;
//Excel einfärben
procedure TMAin.Xls_To_Color(AXLSFile: string; Zeile : integer; Farbe : string; Text : integer);
const
  xlCellTypeLastCell = $0000000B;
var
  Excel, Sheet: OLEVariant;
  Puffer : string;
  Color : integer;
begin
  deletefile('C:\Users\' + login + '\Documents\RESUME.XLW');
  if farbe = 'Weißthen Color := 0;
  if farbe = 'Rot'  then Color := 3;
  if farbe = 'Grünthen Color := 10;
  if farbe = 'Blauthen Color := 41;
  if farbe = 'Gelbthen Color := 6;
  // Create Excel-OLE Object
  Excel := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    Excel.Visible := False;
    // Open the Workbook
    Excel.Workbooks.Open(AXLSFile);
    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := Excel.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    Puffer := inttostr(Zeile+1)+':'+inttostr(Zeile+1);
    if text = 1 then Excel.Selection.Range[Puffer].colorindex := Color else Excel.Range[Puffer].Interior.ColorIndex := Color;
  finally
    // Save file and Quit Excel
    if not VarIsEmpty(Excel) then
    begin
      Excel.save;
      Excel.Quit;
      Excel := Unassigned;
      Sheet := Unassigned;
    end;
  end;
end;
//Excel Raster zeichnen
procedure TMAin.Xls_Grid(AXLSFile: string);
const
  xlCellTypeLastCell = $0000000B;
var
  Excel, Sheet: OLEVariant;
  Puffer : string;
begin
  deletefile('C:\Users\' + login + '\Documents\RESUME.XLW');
  // Create Excel-OLE Object
  Excel := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    Excel.Visible := False;
    // Open the Workbook
    Excel.Workbooks.Open(AXLSFile);
    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := Excel.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    // Oberste Zeile Fett und Grau
    Excel.Range[inttostr(1)+':'+inttostr(1)].Font.FontStyle := 'Bold';
    Excel.Range[inttostr(1)+':'+inttostr(1)].Interior.ColorIndex := 15 ;
    //Rahmen zeichnen
    Puffer := '1:'+ inttostr(Display.RowCount - 1);
    Excel.Range[Puffer].Borders[11].LineStyle := 1;
    Excel.Range[Puffer].Borders[11].Weight := 2;
    Excel.Range[Puffer].Borders[12].LineStyle := 1;
    Excel.Range[Puffer].Borders[12].Weight := 2;
    Excel.Range[inttostr(1)+':'+inttostr(1)].BorderAround(11,3,0,0);
  finally
    // Save file and Quit Excel
    if not VarIsEmpty(Excel) then
    begin
      Excel.save;
      Excel.Quit;
      Excel := Unassigned;
      Sheet := Unassigned;
    end;
  end;
end;
oder hier:

Delphi-Quellcode:
  try
  deletefile('C:\Users\' + login + '\Documents\RESUME.XLW');
  {create variant array where we'll copy our data}
  RowCount := Display.RowCount;
  ColCount := Display.ColCount;
  arrData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
  {fill array}
  for i := 1 to RowCount do
    for j := 1 to ColCount do
      arrData[i, j] := Display.Cells[j-1, i-1];
  {initialize an instance of Excel}
  xls := CreateOLEObject('Excel.Application');
  {create workbook}
  wb := xls.Workbooks.Add;
  {retrieve a range where data must be placed}
  Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1], wb.WorkSheets[1].Cells[RowCount, ColCount]];
  {copy data from allocated variant array}
  Range.Value := arrData;
  {show Excel with our data}
  xls.Visible := False;
  deletefile(neuedatei);
  xls.Range['A1', 'ZZ9999'].EntireColumn.Autofit;
  xls.Application.Workbooks[1].SaveAs(neuedatei);
  finally
    // Save file and Quit Excel
  if not VarIsEmpty(xls) then
    begin
      xls.save;
      xls.Quit;
      xls := Unassigned;
      wb := Unassigned;
    end;
  end;
Bisher behelfe ich mir mit folgendem, was aber eher ein Workaround ist und weniger eine "Lösung":

Delphi-Quellcode:
  //tempdateien löschen
  for i := 0 to 25 do
  begin
    FindFirst('C:\Users\' + Login + '\Desktop\*.tmp', faAnyFile, SearchRec);
    if FileExists('C:\Users\' + Login + '\Desktop\' + SearchRec.name) = true then
    begin
      showmessage(SearchRec.Name);
      deletefile('C:\Users\' + Login+ '\Desktop\' + SearchRec.Name)
    end
    else
     FindClose(SearchRec);
  end;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 09:53
Excel generiert zur Laufzeit temporäre Dateien, unabhängig davon, ob man es direkt benutzt oder per Programm fernsteuert.
Ein ursächlicher Zusammenhang zwischen Deinem Quelltext und den temporären Dateien muss in keiner Weise gegeben sein.

Prüfe doch bitte mal, ob auch dann, wenn Du das, was Du programmiert hast, händisch mit Excel erledigst, temporäre Dateien entstehen und diese beim Beenden von Excel auch wieder entfernt werden.

Wenn nein, liegt das Problem nicht in Deinem Quelltext begründet, sondern ist eher eine Eigen(un)art von Excel.
Ähnlich zu Word, dass seine temporären Dateien auch nicht unbedingt aufräumt.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 10:57
Zitat:
Wenn nein, liegt das Problem nicht in Deinem Quelltext begründet, sondern ist eher eine Eigen(un)art von Excel.
Ähnlich zu Word, dass seine temporären Dateien auch nicht unbedingt aufräumt.
Welche Version von Excel benutzt du denn? Ich benutze Excel 2010 Professional und da wird immer alles aufgeräumt.
Excel 2003 und 2007 haben das auch getan. Was die Versionen nach 2010 tun weiß ich nicht da ich mich gegen diesen "Kachel-Windows 8/10/App-Style" setze.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 11:17
Moin und danke für die Antworten.

In der Regel räumt Excel (2010) die Dateien auf aber nicht immer. Habe die Löschroutine nun ohne Schleife in jede procedure ans ende gestellt, wo Excel genutzt wird. Damit habe ich das "Problem" in den griff bekommen, schöner wäre es natürlich wenn man wüsste warum Excel die nicht immer selber aufräumt.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

AW: Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 11:27
Zitat:
schöner wäre es natürlich wenn man wüsste warum Excel die nicht immer selber aufräumt.
Du darfst nicht vergessen: Windows muss schließlich versteckte Dateien zurücklegen, die über die Telemetrie dann schön an Microsoft gesendet werden können
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 11:36
Du solltest OLEVariant für Sheet und dergleichen "Unassigned" zuweisen, bevor du Excel beendest, nicht anders herum.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Arbeiten mit Excel generiert *.tmp

  Alt 24. Mär 2017, 12:02
Eventuell auch ein Sheet.Unassigned und Worbook.Close, dann Workbook:=Unassigned bevor Excel.Quit und Excel:=Unassigned. Sprich abräumen in der umgekehrten Reihenfolge.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Arbeiten mit Excel generiert *.tmp

  Alt 27. Mär 2017, 09:46
Du solltest OLEVariant für Sheet und dergleichen "Unassigned" zuweisen, bevor du Excel beendest, nicht anders herum.
Aber wenn ich OleVariant Excel als unassigned setze, dann kann ich es danach nicht mehr beenden oder denke ich da gerade falsch!?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Arbeiten mit Excel generiert *.tmp

  Alt 17. Mai 2017, 09:04
Natürlich kann man Excel nur beenden, so lange diese OLE-Variable auf die Excel-Anwendung verweist.
Es geht aber um die anderen Verweise z.B. auf Sheet.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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