私は、単一の .XLS ファイルのいくつかの異なるスプレッドシートからデータを抽出し、後で処理するためにテキスト ファイルに統合する Delphi プログラムを作成しました。Delphi 7コンソールプログラムです。
コードの最も関連性の高い部分を抜粋すると、明らかに、私のプログラムはかなり適切に動作しているか、少なくとも必要なだけ動作していることがわかります。
uses ... ActiveX, ComObj ... ;
procedure Fatal(s:string);
...
Halt(1);
var ExcelApp:Variant; (* global var *)
begin (* main program block *)
coInitialize(nil);
ExcelApp:=CreateOleObject('Excel.Application');
try
ExcelApp.Visible:=False;
ExcelApp.WorkBooks.Open(ExcelFileName);
...
XLSSheet := ExcelApp.Worksheets[ExcelSheetName];
...
try
XLSRange := XLSSheet.Range[ExcelRangeName];
except
Fatal('Range "'+ExcelRangeName+'" not found');
end;
if VarIsNull(XLSRange) then Fatal('Range '+ExcelRangeName+' not found');
for row:=XLSRange.Row to XLSRange.Rows[XLSRange.Rows.Count].Row do
for col:=XLSRange.Column to XLSRange.Columns[XLSRange.Columns.Count].Column do
CellValue:=XLSSheet.Cells[Row,Col].Value;
...
if CellValue<>'' then ...
...
ExcelApp.Workbooks.Close;
...
finally
ExcelApp.Quit;
coUninitialize;
end;
end.
プログラムが終了しても、XLS がロックされたままになることがあります。タスク マネージャーを見ると、クライアント プログラムの実行時に開始された Excel.exe プロセスが、クライアント プログラムが終了して正常にアンロードされたにもかかわらず、まだ実行されていることがわかります。
この行動の通常の容疑者は誰か知っていますか? クライアントの実行時に常にExcelをアンロードする場所を探す場所はありますか?