导出到Excel后,就爹不管,妈不管了吗?自己也不Free了!(30分)

  • 主题发起人 主题发起人 13708782004
  • 开始时间 开始时间
1

13708782004

Unregistered / Unconfirmed
GUEST, unregistred user!
function TBaseExcel.InstallExcelOK: BOOLEAN;
begin
RESULT := FALSE;
try
ExcelObj := CreateOleObject('Excel.Sheet');
ExcelApp := ExcelObj.Application;
if ExcelApp.WorkBooks.Count = 0 then
begin
WorkBook := ExcelApp.Workbooks.Add;
ExcelApp.ActiveSheet.Name := 'Sheet1';
FExcelSheet := ExcelApp.ActiveSheet;
end
else
begin
WorkBook := ExcelApp.ActiveWorkBook;
ExcelApp.WorkSheets[1].Activate;
FExcelSheet := ExcelApp.WorkSheets[1]; // WorkBook.sheets[1];
end;
end

然后大家就往往ExcelApp单元格狂写数据,狂合并单元格,用户也就看到Excel 里的确有数据了!但问题是
try
aExcel := TBaseExcel.Create(10);
aExcel.ExportData();
aExcel.SetVisable(true);
finally
// aExcel.Free; 如果,free,则Excel 就关闭了, 相当没有导出
end;

当然, destructor DESTROY; override; //析构函数里并没有写半句任何代码
大家,想想,难道 ExcelApp,FExcelSheet 就不释放了吗,难道aExcel也不释放了吗?
如何 做到,不关闭导出的Excel,而又要把自己释放的稍微干净点!
 
求大家想想办法!
 
Delphi syntax:
function CreateOleObject(const ClassName: string): IDispatch;
这是返回接口的,而使用接口是不需要手工释放的,事实上是自动释放的,所以aExcel.Free;是不对的!去掉这个!接口的释放是由内部的引用计数决定的,当引用计数为0时就自动销毁!
 
aExcel := Unassigned;
 
to yitang :
你说的没有错!
但用户关闭excel 后,windows 任务管理器公然 还有线程啊!

to:zxy66666
你的方法意思是:
aexcel.FExcelSheet:= Unassigned;
aexcel.ExcelApp := Unassigned;
但他提前就把excel 也关闭了,用户明明想导出excel啊!
 
还有潜力吗?
 
aExcel.Free这句改成
aExcel._AddRef;
再试
 
关注,楼主,我也一样,
有答案回一个,好吗,谢谢 dw-wtt@sohu.com
 
报表机器,ehlib3也有类似导出!
 
aExcel._AddRef;
一点改进都没有!
 
同意yitang。
你可以看看outlook。如果在outlook中调用word编辑邮件(一般是自动调用的),当发送邮件后,word自动关闭,但此时(也许过很长时间后)在资源管理器中还能看到由outlook建立的word进程。事情干完了微软都不去释放它,我想它肯定是yitang兄说的原因了。
 
用variant变量试试...

procedure TFrmPrintReport.DataToExcel;
var
I, J, K, Count: integer;
S: string;
begin
Panel2.Visible :=true;
Animate1.Active :=true;

//创建Ole对象
try
ExcelApplication := CreateOleObject('Excel.Application');
except
ExcelApplication := Null;
Panel2.Visible :=False;
Animate1.Active :=False;
MSShow('请先安装MicrSoft Office Excel97/2000。');
Exit;
end;

ExcelApplication.Visible := False;
try
//加入WorkBook对象
ExcelName:=ExcelApplication.WorkBooks.Add(ExtractFilePath(Application.ExeName)+'ReportModal/Modal.xls');
//加入Sheet对象
ExcelSheet := ExcelName.Worksheets[1];
except
MSShow('没有找到报表模板,请保证Modal.xls在程序文件的ReportModal文件夹内!');
Abort;
end;

try
J := 11;

ADOQuery1.First;
while not ADOQuery1.eof do
begin
ExcelSheet.cells(J,1) := ADOQuery1.RecNo;
ExcelSheet.cells(J,2) := ADOQuery1.fieldbyname('OriHB').Value;
ExcelSheet.cells(j,3) := Trim(ADOQuery1.FieldByName('Camer').AsString );
ADOQuery1.next;
end;

//合并单元格
Ranges:=ExcelSheet.range['A10: P' + inttostr(J -1)];
//画线
Ranges.Borders.LineStyle := 1;
except
MsShow('在往EXCEL写入数据时出现错误');
abort;
end;

try
//保存数据
ExcelName.SaveAs(MDReportDir+'/'+ReportName);
except
MSShow('无法保存数据');
Panel2.Visible :=False;
Animate1.Active :=False;
abort;
end;

//全部释放variant变量 ,否则Excel进程无法关闭
try
ExcelName.Close;
ExcelApplication.Quit;
ExcelSheet :=Unassigned ;
ExcelName := Unassigned;
ExcelApplication:=Unassigned;
Ranges :=Unassigned;
except

end;

end;
 
忘了...
var
ReportName,ReportAllName: string;
ExcelApplication,ExcelName,ExcelSheet,Ranges:variant;
 
我实在无法忍受不能彻底卸载,最后,我采用了本办法:
导出过程,隐藏,
导出完成关闭,再让shellExce 外部打开!
哈哈,老板高兴,客户高兴,我也高兴,全部问题ok....
 
哈哈 ,
楼主的解决方法才是最根本的解决方法。恩,以后我也这么干好了:)
不过我想,你导出数据是要给人看的。所以导出后客户要干什么就由他去了,
难道他要传真出去我们也管?
如果不是给看的。那么先保存了再关掉不是更好一点?
 
后退
顶部