我的程序在代码中使用了这三个对象:XLApp:TExcelApplication;   XLBook:TExcelWorkbook;   XLSheet:TExcelWorksheet; 我的程序是运行正常的。但是如果在资源管理器中再双击硬盘上任一个excel文件时,首先都只能看到文件的标题,而内容一定要点全屏显示才能看见,看见后再去掉全屏显示就是正常效果了。有时把我的程序关掉了,仍会有这种情况。但是如果先从开始菜单里运行空的excel程序,再打开任一表格的话,效果都会很正常。
这是什么原因呢?该如何解决才能使得在我的程序运行的同时,可正常双击打开其他excel文件呢?多谢!

解决方案 »

  1.   

    是不是那几个变量没有释放呢或者没有断开连接?
    比如:
      XLApp.Quit;
      

  2.   

    to : gdufo(仅代表个人观点^_^) 
    我已经都用过xlapp.quit这样的语句了!后来我仔细观察发现:在点了导入或导出按钮(这两个按钮用到excel对象或控件,导入用控件,导出用对象)之后,系统中仍留有一个excel进程,所以才导致双击表格时出问题。只要把那个进程结束掉,就一切正常了。那么哪位高手能告诉我如何在xlapp.quit后加入语句来结束掉内存中残留的excel进程吗?(希望用尽可能简单实用的方法)
    多谢了!
      

  3.   

    用了xlapp.destro效果不好!会提示看不懂的内存错误!
      

  4.   

    采用杀掉Excel ole进程的办法:
      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;
      

  5.   

    to : xfwf(晓枫晚风)
    先谢谢你的高见,不过我不太看得懂你的代码,能否加点注释?另外我在代码中只要调用你的这个过程就可以杀掉内存中所有的excel进程吗?如果杀掉所有的,好象也不太妥当,因为我的意图只是把我的导入导出按钮引发的excel进程杀掉就行了,不希望把用户手工打开的其他excel进程杀掉啊?
    多谢!
      

  6.   

    另外加了您的过程后,run时系统出错,提示:TProcessEntry32是不可识别的标识符。这应当是 在uses中少加了某个资源吧?烦请您明示要加入哪些资源?多谢
      

  7.   

    我见过类似的问题,没释放掉.
    xlapp.WorkBooks.Close(false,emptyparam,emptyparam);
      

  8.   

    to  smile_mj() and steaddream() 
    先谢两位,不过我用了xlapp.WorkBooks.Close(1)语句时不但杀不了excel进程,反而会弹出一个ole的英文错误。且括号中如果用(false,emptyparam,emptyparam),连编译都通不过。括号里只能有一个整形值 。
    请各位继续指点,谢谢
      

  9.   

    其实我觉得还是直接用ole进行连接比较好,不用delphi给的控件。
      

  10.   

    我已经用xls:=createoleobject('excel.application');的方法搞定了将数据导出到EXCEL表中,但是现在有个头痛的问题,就是不知在用OLE的场合下,如何画格子线??
    用xls.ActiveSheet.Range[ 'A1:G100' ].Columns.Borders.LineStyle :=xlContinuous;的方法可以将1到100行都画上格子线,但是我的行数是不固定的,只知变量i 等于行数,但用'A1:Gi' 的形式,运行时会出错。请问各位高手能指明解决的方法吗?
    一旦得到解答,本人马上结帐,多谢各位!!!
      

  11.   

    Fexcel.application.workbooks.close;
     if not VarIsEmpty(Fexcel) then
       Fexcel.application.quit;
       Fexcel := unassigned;
    找到解决方法了 ,加上上面那一句就可以了
      

  12.   

    多谢cyblueboy83(爱情白痴—电脑迷) ,可现在我已经改用ole了,现在如何在用OLE导出的表格中画表格线呢?
    我已经用xls:=createoleobject('excel.application');的方法搞定了将数据导出到EXCEL表中,但是现在有个头痛的问题,就是不知在用OLE的场合下,如何画格子线??
    用xls.ActiveSheet.Range[ 'A1:G100' ].Columns.Borders.LineStyle :=xlContinuous;的方法可以将1到100行都画上格子线,但是我的行数是不固定的,只知变量i 等于行数,但用'A1:Gi' 的形式,运行时会出错。请问各位高手能指明解决的方法吗?
    一旦得到解答,本人马上结帐,多谢各位!!!
      

  13.   

    我开发都用的是createoleobject,上面出现的问题,都是因为对象没有正常释放产生的,所以开发时一定要注意按创建时的相反顺序释放变量。
    另外,在开发时如果有不明白的东西,可以打开EXCEL或WORD,然后用工具菜单下的“录制宏”,把你要做的操作录下来,然后再查看宏的编码,这样,遇到不会的都可以用这种方法得到解决办法。
    提醒大学,并不VBA中的所有参数都可以用OLE的方法调用。
    http://www.superetcn.com/DOWLOADWEB/Delphi_Code.htm
    是我写的一个WORD调用的类。供大家参考.
      

  14.   

    多谢zwenli(前进不息) :新年好,先谢你对我问题的高见,不过现在我也用了createoleobject,也经不会出现残留excel进程的问题了,但是我不知如何在这种方式创建的excel表中画格子线,请您指点一下,好吗?最好写一下具体语句,多谢!
      

  15.   

    以下是VBA有代码。
      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代码窗口会看到该代码。
    具本是在宏菜单里有“宏”菜单,编码录制的新宏,就可以看到原码。
    “授人以鱼,勿如授人以渔”。
      

  16.   

    zwenli(前进不息):
    多谢你,只是问题的关键是:Range("C3:G14").Select,是固定了行列的,而我的代码中不能固定行数,而用用变量的形式编译通不过。如Range("C3:Grow").Select   其中row 为存了行数的整形变量这如何是好?请各位继续指点!
      

  17.   

    最后的关键问题:得到解答后就结帐!
    zwenli(前进不息):
    多谢你,只是问题的关键是:Range("C3:G14").Select,是固定了行列的,而我的代码中不能固定行数,而用用变量的形式编译通不过。如Range("C3:Grow").Select   其中row 为存了行数的整形变量这如何是好?请各位继续指点!多谢
      

  18.   

    我以前开发的源代码,里面应该有你要的
    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;
      

  19.   


    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.
      

  20.   

    DEPHI的CreateOleObject方法实际上就是引用Office中的VBA编程,所以相关问题可以在office中的VBA帮助中找到答案。vba中的对象是相关嵌套引用的,如range,selectiont等都是可以嵌套的,在编程时,明白这一点相当重要。有问题直接发邮件到我的邮箱里。[email protected]。csdn不常上。
      

  21.   

    问题基本解决,感谢各位帮助,特别鸣谢zwenli(前进不息)  maxtool(≮From NingBoo≯)  xnk9499(许默然)三位高手!
    即刻结帐!以后还请各位指导!多谢