Hallo,
ich möchte in einem Thread, der in einem Dienst läuft, eine Excel-Tabelle erzeugen, mit Daten füllen und unter einem gegebenen Namen speichern.
Ich habe bereits eine Methode, die in einem "normalen" Desktop-Programm erfolgreich eingesetzt wird, für den Thread übernommen.
Allerdings erhalte ich nun die Fehlermeldung "Die Close-Methode des Workbook-Objektes konnte nicht ausgeführt werden" und habe keine Ahnung, wieso.
Hier der Code:
Delphi-Quellcode:
function TResultT.CreateExcelFile(strProgram:
string; strPDFName:
string; intCustID: integer):
string;
var
strFilename:
string;
Excel : variant;
qryTemp : TIBCQuery;
intRow : integer;
iCnt : Integer;
_lcid : integer;
begin
Result := '
';
strFileName := StringReplace(strPDFName, '
.pdf', '
.xls', []);
try
try
OleInitialize(
nil);
Excel := CreateOleObject('
Excel.Application');
except
ShowMessage('
Excel konnte nicht gestartet werden!');
Result := '
';
Exit;
end;
_lcid := GetUserDefaultLCID;
Excel.Workbooks.Add;
Excel.Visible := False;
// TRUE = Excel sichtbar.
Excel.Worksheets[1].Activate;
Excel.Cells[1,1] := '
blabla';
// Hier werden dann Daten aus einer Abfrage in die Excel-Tabelle geschrieben
if (FileExists(strFilename))
then
begin
SysUtils.DeleteFile(strFilename);
end;
Excel.Worksheets[1].Range['
a1', '
a1'].EntireColumn.autofit;
Excel.Worksheets[1].Range['
b1', '
b1'].EntireColumn.autofit;
Excel.Worksheets[1].Range['
c1', '
c1'].EntireColumn.autofit;
Excel.Worksheets[1].Range['
d1', '
d1'].EntireColumn.autofit;
Excel.Worksheets[1].Range['
e1', '
e1'].EntireColumn.autofit;
Excel.Worksheets[1].Range['
f1', '
f1'].EntireColumn.autofit;
Excel.DisplayAlerts := False;
try
Excel.ActiveWorkBook.Close(True, strFileName);
// <-- Hier knallts mit der o. a. Fehlermeldung
Excel.DisplayAlerts := True;
except
on E:
Exception do
begin
WriteLog('
Excel-Tabelle "' + strFileName + '
"konnte nicht erzeugt werden, Meldung: ' + E.
Message, 1);
strFileName := '
';
end;
end;
finally
Excel.Quit;
Excel := unassigned;
OleUnInitialize;
end;
Result := strFilename;
end;
Wie gesagt, ich weiss nicht, wieso jetzt .Close nicht mehr funktioniert. Ich habe auch .SaveAs(strFileName) ausprobiert, mit dem gleichen Ergebnis.
In dem Ordner, in dem die XLS-Datei erzeugt werden soll, werden vorher im gleichen Thread 1 - n PDF-Dateien erzeugt. Das klappt einwandfrei, also vermute ich mal, dass es kein Rechteproblem ist. Excel ist auch installiert.
Hat vielleicht jemand eine Tipp?
Grüße
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty