![]() |
Arbeiten mit Excel generiert *.tmp
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:
oder hier:
//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ün' then Color := 10; if farbe = 'Blau' then Color := 41; if farbe = 'Gelb' then 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;
Delphi-Quellcode:
Bisher behelfe ich mir mit folgendem, was aber eher ein Workaround ist und weniger eine "Lösung":
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;
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; |
AW: Arbeiten mit Excel generiert *.tmp
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. |
AW: Arbeiten mit Excel generiert *.tmp
Zitat:
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. |
AW: Arbeiten mit Excel generiert *.tmp
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. |
AW: Arbeiten mit Excel generiert *.tmp
Zitat:
|
AW: Arbeiten mit Excel generiert *.tmp
Du solltest OLEVariant für Sheet und dergleichen "Unassigned" zuweisen, bevor du Excel beendest, nicht anders herum.
|
AW: Arbeiten mit Excel generiert *.tmp
Eventuell auch ein Sheet.Unassigned und Worbook.Close, dann Workbook:=Unassigned bevor Excel.Quit und Excel:=Unassigned. Sprich abräumen in der umgekehrten Reihenfolge.
|
AW: Arbeiten mit Excel generiert *.tmp
Zitat:
|
AW: Arbeiten mit Excel generiert *.tmp
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 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 by Thomas Breitkreuz