我的程序在代码中使用了这三个对象:XLApp:TExcelApplication; XLBook:TExcelWorkbook; XLSheet:TExcelWorksheet; 我的程序是运行正常的。但是如果在资源管理器中再双击硬盘上任一个excel文件时,首先都只能看到文件的标题,而内容一定要点全屏显示才能看见,看见后再去掉全屏显示就是正常效果了。有时把我的程序关掉了,仍会有这种情况。但是如果先从开始菜单里运行空的excel程序,再打开任一表格的话,效果都会很正常。
这是什么原因呢?该如何解决才能使得在我的程序运行的同时,可正常双击打开其他excel文件呢?多谢!
这是什么原因呢?该如何解决才能使得在我的程序运行的同时,可正常双击打开其他excel文件呢?多谢!
比如:
XLApp.Quit;
我已经都用过xlapp.quit这样的语句了!后来我仔细观察发现:在点了导入或导出按钮(这两个按钮用到excel对象或控件,导入用控件,导出用对象)之后,系统中仍留有一个excel进程,所以才导致双击表格时出问题。只要把那个进程结束掉,就一切正常了。那么哪位高手能告诉我如何在xlapp.quit后加入语句来结束掉内存中残留的excel进程吗?(希望用尽可能简单实用的方法)
多谢了!
procedure TMainForm.TerminateOLE; // 杀掉Ole Excel 的进程
var
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
Ret : BOOL;
ProcessID : integer;
s:string;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
Ret:=Process32First(FSnapshotHandle,FProcessEntry32);
while Ret do
begin
s:=ExtractFileName(FProcessEntry32.szExeFile);
if s='EXCEL.EXE' then
begin
ProcessID:=FProcessEntry32.th32ProcessID;
TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,ProcessID),1);
s:='';
end;
Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
先谢谢你的高见,不过我不太看得懂你的代码,能否加点注释?另外我在代码中只要调用你的这个过程就可以杀掉内存中所有的excel进程吗?如果杀掉所有的,好象也不太妥当,因为我的意图只是把我的导入导出按钮引发的excel进程杀掉就行了,不希望把用户手工打开的其他excel进程杀掉啊?
多谢!
xlapp.WorkBooks.Close(false,emptyparam,emptyparam);
先谢两位,不过我用了xlapp.WorkBooks.Close(1)语句时不但杀不了excel进程,反而会弹出一个ole的英文错误。且括号中如果用(false,emptyparam,emptyparam),连编译都通不过。括号里只能有一个整形值 。
请各位继续指点,谢谢
用xls.ActiveSheet.Range[ 'A1:G100' ].Columns.Borders.LineStyle :=xlContinuous;的方法可以将1到100行都画上格子线,但是我的行数是不固定的,只知变量i 等于行数,但用'A1:Gi' 的形式,运行时会出错。请问各位高手能指明解决的方法吗?
一旦得到解答,本人马上结帐,多谢各位!!!
if not VarIsEmpty(Fexcel) then
Fexcel.application.quit;
Fexcel := unassigned;
找到解决方法了 ,加上上面那一句就可以了
我已经用xls:=createoleobject('excel.application');的方法搞定了将数据导出到EXCEL表中,但是现在有个头痛的问题,就是不知在用OLE的场合下,如何画格子线??
用xls.ActiveSheet.Range[ 'A1:G100' ].Columns.Borders.LineStyle :=xlContinuous;的方法可以将1到100行都画上格子线,但是我的行数是不固定的,只知变量i 等于行数,但用'A1:Gi' 的形式,运行时会出错。请问各位高手能指明解决的方法吗?
一旦得到解答,本人马上结帐,多谢各位!!!
另外,在开发时如果有不明白的东西,可以打开EXCEL或WORD,然后用工具菜单下的“录制宏”,把你要做的操作录下来,然后再查看宏的编码,这样,遇到不会的都可以用这种方法得到解决办法。
提醒大学,并不VBA中的所有参数都可以用OLE的方法调用。
http://www.superetcn.com/DOWLOADWEB/Delphi_Code.htm
是我写的一个WORD调用的类。供大家参考.
Range("C3:G14").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
将以上代码按DELPHI的形式进行修改就行了。
EXCE中有录制新宏,这一菜单,在工具菜单下的宏菜单里。
如果还有类似的问题,你可以将要的操作录下来。在VBA代码窗口会看到该代码。
具本是在宏菜单里有“宏”菜单,编码录制的新宏,就可以看到原码。
“授人以鱼,勿如授人以渔”。
多谢你,只是问题的关键是:Range("C3:G14").Select,是固定了行列的,而我的代码中不能固定行数,而用用变量的形式编译通不过。如Range("C3:Grow").Select 其中row 为存了行数的整形变量这如何是好?请各位继续指点!
zwenli(前进不息):
多谢你,只是问题的关键是:Range("C3:G14").Select,是固定了行列的,而我的代码中不能固定行数,而用用变量的形式编译通不过。如Range("C3:Grow").Select 其中row 为存了行数的整形变量这如何是好?请各位继续指点!多谢
excelworksheet1.disconnect;
excelworkbook1.Disconnect;
excelapplication1.Disconnect;
ExcelApplication1.Visible[0]:=False;
ExcelApplication1.Caption:='Excel Application';
LCID:=GetUserDefaultLCID();
Excelapplication1.Workbooks.Open(ExtractFilePath(Application.ExeName)+'kucun.xls'
,EmptyParam,EmptyParam,EmptyParam
,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam
,EmptyParam,EmptyParam,EmptyParam,LCID);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo
(ExcelWorkbook1.Worksheets[1] as _Worksheet);
Sheet:=ExcelApplication1.Workbooks[1].Worksheets[1];
ExcelWorksheet1.Cells.Item[1,3]:=tempstr1+' '+tempstr2;
l:=ExcelWorksheet1.UsedRange[LCID].Rows.Count;
Range:=Sheet.range[sheet.cells[4,1],sheet.cells[l,11]];
range.select;
range.delete;
row:=4;
countnum:=0;
lotnotemp:=fieldbyname('lotno').AsString ;
for i:=1 to RecordCount do
begin
if lotnotemp=fieldbyname('lotno').AsString then
begin
countnum:=countnum+fieldbyname('num').AsFloat ;
ExcelWorksheet1.Cells.Item[row,1]:=fieldbyname('custcode').AsString;
ExcelWorksheet1.Cells.Item[row,2]:=fieldbyname('lotno').AsString;
ExcelWorksheet1.Cells.Item[row,3]:=fieldbyname('name').AsString;
ExcelWorksheet1.Cells.Item[row,4]:=fieldbyname('resvalue').AsString;
ExcelWorksheet1.Cells.Item[row,6]:=fieldbyname('finishstock').AsString;
ExcelWorksheet1.Cells.Item[row,5]:=fieldbyname('num').AsString;
ExcelWorksheet1.Cells.Item[row,11]:=fieldbyname('requestdate').AsString;
recno:=recno+1;
inc(row);
end;
if (lotnotemp<>fieldbyname('lotno').AsString) or (i=recordcount) then
begin
ExcelWorksheet1.Cells.Item[row,1]:=':'+floattostr(countnum)+' k';
Range:=Sheet.range[sheet.cells[row,1],sheet.cells[row,3]];
range.select;
range.merge;
inc(row);
countnum:=0;
lotnotemp:=fieldbyname('lotno').AsString ;
end;
end;
end;
ExcelWorksheet1.Cells.Item[row,1]:=';
for i:=2 to row-1 do
begin
Range:=Sheet.range[sheet.cells[i,1],sheet.cells[i,11]];
Range.borders.linestyle:=1;
end;
ExcelApplication1.Visible[0]:=True;
end;
Range 和 Cells可用 Range(cell1, cell2) 返回 Range 对象,其中 cell1 和 cell2 为指定起始和终止位置的 Range 对象。下例设置单元格区域“A1:J10”的边框线条样式。With Worksheets(1)
.Range(.Cells(1, 1), _
.Cells(10, 10)).Borders.LineStyle = xlThick
End With
以上为RANGE的用法。
转到DELPHI中 Worksheets(1)变成delphi中的OLEVariant变量,这个变是指定的worksheet.
即刻结帐!以后还请各位指导!多谢