Delphi5 控制 Excel2000 心得(0分)

  • 主题发起人 主题发起人 sandy suen
  • 开始时间 开始时间
各位兄弟,
为什么在WinXP下以下语句不行了呢?
sheet.PageSetup.PrintGridLines := True;
 
要是有用delphi控制access的经验就好了,
收藏[8D]
 
终于找到这里来了!
亲人哪! [:)][:)][:)][:)]

各位大虾
我用DELPHI控制EXCEL
可是每次用了EXCEL以后的释放都有问题
第二次重用的时候总报一个“RPC服务器不可用”的错误
我先中断OLE的连接的话,第二次用的时候EXCEL就只能把标题拦显示而显示不出来内容
若不先终止再连接的话就会报上面的错误

各位大虾帮忙!万分感激!
 
我也有相同的情况,只出现标题栏,不显示内容,代码如下,请指教
var
i,row:integer;
begin
if SaveDialog1.Execute then
begin
Screen.Cursor:=crHourGlass;
ExcelApplication1.Connect;
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet);
for i:=0 to adoQuery1.Fields.Count-1 do
ExcelWOrkSheet1.Cells.Item[1,i+1]:=adoQuery1.Fields.FieldName;
row:=2;
while not adoQuery1.Eof do
begin
for i:=0 to adoQuery1.Fields.Count-1 do
begin
ExcelWOrkSheet1.Cells.Item[row,i+1]:=adoQuery1.Fields.AsString;
end;
row:=row+1;
adoQuery1.Next;
end;
ExcelWorkBook1.SaveCopyAs(SaveDialog1.FileName);
ExcelWOrkBook1.Close(false);
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
Screen.Cursor:=crDefault;
Application.MessageBox('Export successfully!','Information',0);
end;
 
可能是创建的excel对象没有手动释放,(创建的其它variant变量在用完后也尽量手动释放)
你们可以查查是否出现这个错误后,还有excel进程在后台
比如在前面创建了excel对象
var ExcelApp: Variant;
ExcelApp := CreateOleObject( 'Excel.Application' );



//为防止疏忽,可以把下面代码放在form的OnDestroy事件中
if VarIsEmpty(ExcelApp)=false then
begin
ExcelApp.ActiveWorkBook.Saved := True; //不出现保存对话框
ExcelApp.Workbooks.close;
ExcelApp.quit;
//关键一步
//下面是将excelApp这个variant变量手动释放,不要轻信仅仅做了上面的工作就可以
shjjExcelApp:=unAssigned;
end;

保险起见,创建了几个variant(olevariant)变量,就手动释放几个
 
to ALL:
怎么我的问题一直没人答?希望高人同赐教:
如何在程序中实现:把Excel表格以邮件内容的形式发送?我试过用Sendmail方法,
但它是以附件的形式,请大虾们指点指点。
 
to 海之豚:
谢谢你的答案
我在窗体的OnDestroy事件中有释放这个变量
但是问题产生在我在窗体中多次调用的时候,就是说在窗体没有Destroy之前
我每次调用都做如下动作:
if (Assigned(RGetActiveOleObject('Excel.Application')) and (not VarIsEmpty(ExcelApp))) then
begin
ExcelApp.Quit;
ExcelApp := UnAssigned;
end;

function RGetActiveOleObject(
const ClassName: string): IDispatch;
var
ClassID: TCLSID;
IUnk: IUnknown;
begin
Result := nil;
ClassID := ProgIDToClassID(ClassName);
GetActiveObject(ClassID, nil, IUnk);
if Assigned(IUnk) then
IUnk.QueryInterface(IDispatch, Result);
end;

但还是会出现那种上面说的那种情况;
问题出在哪里?烦请老兄帮忙!



 
to 小头鹰:
你使用GetActiveObject函数,必须保证确实有excel应用已经启动!
你的最后一个if应该有else处理。
 
to yeskert1兄:
  你说的问题我都注意到了,现在的问题是:
我在程序调用EXCEL之前,如果已经打开EXCEL,我在程序中可以检查到这个已经存在的
EXCEL。EXE,可以在进程里先把它TerminateProcess结束,这个时候我必须在程序中用代码
重新打开EXCEL,但这个时候即使进程中都已经不存在EXCEL。EXE,我在上面的程序语句:
GetActiveObject(ClassID, nil, IUnk);
中还能够得到一个不为 nil 的 IUnk,这个时候程序就报“RPC服务器不可用”的错误,给
我的感觉就是,我没有把句柄完全释放,从而导致这个错误,你觉得我这里应该怎么样来
写才可以完全释放?
请大家多多关注!谢谢![:)][:)][:)][:)]
 
我在程序中调用的EXCEL都不会出现这个问题
好象我的程序捕捉不到以前已经打开了的应用程序的句柄 [:(]
 
还有
如果我在EXCEL表各种查找一个表格中RANGE范围,然后拷贝这个范围,
而该表格中又没有这个定义的RANGE的话,即使用 TRY 。。EXCEPT 。。
程序还是会一样的报告一个 OLE 错误,然后终止,
或者,用程序打开一个不是 。XLS 格式的文件,也会报这样的错误
我试着在 TRY 。。。 EXCEPT 。。。 的EXCEPT 中打开一个有该RANGE范围的 。XLS文件
但根本执行不到EXCEPT中就已经由OLE错误或者 RPC服务器错误终止跳出了我的代码范围
头大!·!
各位GGJJDDMM帮忙发动你们聪明的大脑,发挥你们的古道热肠,解救水深火热之中的我吧!
上帝保佑吃了饭和没吃饭的我们!
 
to 楼主:(sandy suen, )
楼主你们研究了很久的DELPHI 控制 EXCEL了, 经验丰富,烦请多多指点,
各位大虾们也一起帮帮忙UPUP或者帮小弟我解决一下这个问题吧 [:)] 先在
这里多谢大家了 [:D]
 
to linyi_cn:今天忽然发现你的贴子:
----------------------------
你们的方法很老套了,谁都会。
其实可以把olecontainer和delphi控件结合处理,从界面上看就是自己的程序。
这样可以用oleobject获得excelapplication对其操作,从而利用ole与excel的良好兼容性。
另外可以把delphi自带控件与olecontainer中的excel连接起来,从而获得excel的事件,
如openworkbook,sheetchange等,这样可以得到excel中输入的数据。
如果不想用olecontainer,也可以激活单独的excel,并且在其中添加自己的工具栏和快
捷按钮,以激发自己编写的过程(这种技术早在1999年就已经被通用财务软件采用了)。

你们现在贴的这些就连那些电脑杂志上也不知道发表多少次了!
----------------------------

我知道你是高手,估计我的问题你都能解决,请多帮忙。
我的问题:
var obj:olevariant;
...
如何让olecontainer“连接”到obj?
感谢!!
如果你回答,我另开一个200分的问题给你。
 
to 海之豚:
兄弟有没有什么好方法把一段VBA代码由DELPHI传到一个EXCEL表格?
 
請哪位大蝦幫我解決一下
ExcelApp.SaveAs( 'C:/Excel/Demo1.xls' );
為什麼報錯說不支持SaveAs
具體報錯內容為SaveAs not Supported by automation Object
拜托拜托
謝謝
 
大开眼界,我必须加倍努力
 
在程序中如何感知range的最后一行,这对导入数据非常有帮助。
 
后退
顶部