CreateOleObject('Excel.Application')的问题,高手进 ( 积分: 100 )

  • 主题发起人 主题发起人 小虾米爱吃鱼
  • 开始时间 开始时间

小虾米爱吃鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:电脑A,电脑B,均为XP OS,其中A主机中的盘符(H:)为映射了B主机的一个共享文件夹(d:/MYWork)。主机A中执行我的程序(代码见下面),B主机执行其它公司的一个程序,B主机的程序有一个功能,就是将软件中的生成的数据以一定的格式生成EXCEL文件,如:点击按扭[导出],那么就在B主机的d:/mywork文件夹下生成一个excel文件(work1.xls),同时,B主机上的程序显示了导出过程中启动的EXCEL,并在文件生成结束后不自动关闭该EXCEL程序,导致文件work1.xls一直被主机B中的EXCEL程序打开着。
然后我来说下A主机的工作:A主机的程序是循环检测指定目录(H:/)下是否有*.xls文件,有,则通过如下代码处理该文件,无则继续检测。好,现在问题来了,当B主机刚刚生成文件work1.xls的时候,在A主机的H:/下检测到文件存在,那么A电脑的程序要去打开该文件,此时由于B电脑的EXCEL程序仍然打开着work1.xls文件,所以,在A主机上的程序就出现了打开方式提示框(现在可以只读方式打开文件‘work1.xls’,确定则打开,取消则放弃....),提示的具体内容不记得了,反正就是这个意思。那么这个时候A主机的程序就卡住了,不会自动执行了!

奇怪的是在2000 OS下,我类似的测试,没有提示框,只是出现了异常,那至少不会卡住啊!怎么在XP下,OFFICE的这个OLE会自作主张弹对话框的啊?

问题就是这样,是不是我说的这个原因?,那我现在有什么办法可以解决吗?请问高手

代码如下:
try
ExcelApp:=CreateOleObject('Excel.Application');
except
Form_WJJWTFXT.AddMemoText('没有安装Excel2000! 请安装后再做本工作',3);
ExcelApp.displayAlerts:=false;
ExcelApp.free;
result:=false;
exit;
end;

try
ExcelApp.workbooks.open(StrFileName);
ExcelApp.worksheets[1].activate;
i:=2;
while truedo

begin

inc(i);
str1:=ExcelApp.activesheet.cells.item[i,1];
//工号
str2:=ExcelApp.activesheet.cells.item[i,2];
//内容
str3:=ExcelApp.activesheet.cells.item[i,3];
//姓名
if (str1='') and (str2=')' and (str3=')' then
break
else
do
_MY //做我要做的处理,这里和EXCEL就没什么关系了
end;

ErrorB:=true;
except
ErrorB:=false;
end;

if ErrorB then

begin

ExcelApp.activeWorkBook.saved:=true;
end;

ExcelApp.workbooks.close;
ExcelApp.quit;
 
呵呵 ,你让他用只读方式打开不就行了?
这句,再加个参数,这样写
ExcelApp.workbooks.open('d:/11.xls',ReadOnly:=True);
 
问题没那么简单啊
 
?我试了,这样可以打开别的程序正在编辑的文档啊,还有什么问题?
 
ExcelApp.workbooks.close;
ExcelApp.quit;


[red]改为下面的:
ExcelApp.WorkBooks.Close;
ExcelApp.QUIT;
VarClear(ExcelApp);[/red]
 
我去测试一下!不知道我用EXCEL打开一个文件,再另存,是不是能达到这个测试效果!
 
后退
顶部