excel操作问题 ( 积分: 100 )

  • 主题发起人 主题发起人 zmylch
  • 开始时间 开始时间
Z

zmylch

Unregistered / Unconfirmed
GUEST, unregistred user!
最近写一个从数据库的导出excel表的程序。现发现在导出excel表的过程中excel被程序占用,其它的excel文件就不能打开。请各位帮帮忙。
 
可能导出excel表后没有关闭与excel的连接.
把EXECL APPLICTION的 AutoQuit的值选会True
当向Excel写完数据后,用ExcelApplication1.Disconnect关闭
应用程序与Excel的连接.
 
已经关闭。
try
ExcelApp := CreateOleObject('Excel.Application');
except
ShowMessage('您的机器里未安装Microsoft Excel。');
Exit;
end;

ExcelApp.workbooks.Add;
ExcelApp.ActiveWorkbook.sheets[1].name := 'abc;
ExcelApp.WorkSheets[1].Activate;
......写excel内容
ExcelApp.ActiveWorkbook.SaveAs(xlsFilename);
ExcelApp.ActiveWorkbook.Close;
ExcelApp.Quit;

问题不是出在是否关闭上,是出在我正在利用excel导出数据,而同时打开另外一份excel进行操作。
比如说:我现在正在导出报表,同时我又打开d:/123.xls进行操作。导出的文件与我操作的文件不相关。
 
先从进程里结束EXCEL后,再打开EXCEL就可以了。

uses TLHelp32;

{$R *.dfm}
{=================================================================
功 能: 结束进程里的AFileName程序
参 数: AFileName文件名称
=================================================================}
procedure EndProcess(AFileName: string);
const
PROCESS_TERMINATE = $0001;
var
ExeFileName: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ExeFileName := AFileName;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EndProcess('EXCEL.EXE');
end;
 
如果使用ado连接excel,可能不行,ado要求唯一访问文件
 
如果你想在程序导出的过程中,打开其它的excel文件,只有在执行导出之前,先开启一个excel。
 
to bbscom:
如果我导出开始时没有excel进程,而在导出过程中才打开另外的excel文件,程序一样会报错。
to tony1203:
您可以同时打开多个excel看看,同时打开多个excel在任务管理器中只有一个excel进程。它实际上是打开一个excel形成多个工作表。
 
很显然你是想当然 或者你没有看清我怎么说
======================

如果先手动打开一个excel, 和 程序打开excel不会是一个进程!
但是如果先用程序打开了excel,再用手动打开文件,就出现你说的情况了。
 
多人接受答案了。
 
后退
顶部