excel批量导入700条数据以上,报错:"out of memory while expanding memory stream",stringgrid上面只能显示700多条导入的数据,其余数据因报错未显示出来,内存我已经释放了,找不到原因
代码释放打开的excel进程后,但是任务管理器里有多个excel.exe,未关闭干净,不知道如何处理?function  Tform_ddlsxthexcel.ExcelToBill(iParm:integer=0): Integer;    //excel导入
var
  ExcelApp,Sheet:olevariant;
  i,k,h,m,n,rowcnt,CmEndCol,tmpInt,error,errorflag:Integer ;
  path,CheckEndStr,strSql:String ;
  strSpdm,strGg1dm,strGg2dm:string ;
  OpenPath: TOpenDialog;
  GgQry,cs,qdcs,cdcs,dcshangpin:TClientDataSet;
  mibh: Integer;
  zk:Variant;
  xsrq,dpbh,sl,sl1,bzj,dj,vip,bz,djbh,smod,delu,spstr: String;
  DmReturn:RDmReturn ;
  Attr:integer;
  strMsg11851,str1,str2,str3,slstr: string;
  FDjCodeInfo:RDjCodeInfo;begin  result:=-1 ;
  strMsg11851 := '无法连接到Excel!您需要重新进入本系统,若再次出现这个提示时您可能要重新启动您的计算机。确定退出吗?';
  path:=ExtractFileDir(Application.ExeName) ;
  OpenPath:=TOpenDialog.Create(self) ;
  OpenPath.Filter :='*.xls' ;   //文件类型
  OpenPath.InitialDir :=ExtractFileDir(path) ;    //打开初始路径
  if OpenPath.Execute then
    path:=OpenPath.FileName
  else
    exit ;
    
  ExcelApp:=CreateOleObject('Excel.Application');
  try
    self.Repaint ;
    ExcelApp.workbooks.open(path);
    //WorkSheetsNo:=ExcelApp.Worksheets.Count;    //工作表的数量
  except
    ExcelApp.quit;
    beep;
    if application.MessageBox(pansichar(strMsg11851),'提示|点''否''退出',MB_YesNo)=idyes then
       exit;
     //无法连接到Excel!您需要重新进入本系统,若再次出现这个提示时您可能要重新启动您的计算机。确定退出吗?
  end;  result :=0 ;    Sheet:=ExcelApp.workbooks[1].worksheets[1];    Screen.Cursor:=crHourGlass;
    k:=1 ;                  //从excel中第二行开始读数据
    CheckEndStr:=Trim(Sheet.cells[k,1]) ;
    while CheckEndStr='' do
    begin
      inc(k) ;  //求行数
      CheckEndStr:=Sheet.cells[k,1];      //将单据主表的表头
      continue ;
    end;    if CheckEndStr='0' then
    begin
       rowcnt:=k+strtoint(Sheet.cells[k,3])+1;   //数据行开始位置     11
       CmEndCol:= strtoint(sheet.cells[k,4])+4;   //取尺码以外的列的位置    22
       i:=1;
       mibh:=0;
     while ( CheckEndStr<>'')    do
      begin
      try
       GgQry:=TClientDataSet.Create(Self) ;
       cs:=TClientDataSet.Create(nil);
       qdcs:=TClientDataSet.Create(nil);
       cdcs:=TClientDataSet.Create(nil);
       dcshangpin:=TClientDataSet.Create(nil);
        xsrq:=Trim(Sheet.Cells[rowcnt,1]);
        dpbh:=Trim(Sheet.Cells[rowcnt,2]);
        strSpdm :=Trim(Sheet.Cells[rowcnt,3]) ;
        strGg1dm :=Trim(Sheet.Cells[rowcnt,4]) ;
        DmReturn.strCode:=strGg1dm;
        DataMain.SelectSql('select qddm from kehu where khdm='''+dpbh+'''',qdcs) ;
        delu:=  qdcs.FieldByName('qddm').AsString ;        //求店铺的所属渠道代码
        while (delu <> g_User.strQddm) or (g_User.strQddm<>'000') do    //与登录人的所属渠道进行对比
        begin
           DataMain.SelectSql('select qddm from kehu where khdm='''+qdcs.FieldByName('qddm').AsString+'''',cdcs) ;
           delu:=cdcs.FieldByName('qddm').AsString;        //求店铺的所属渠道代码
           if cdcs.IsEmpty then
           begin
            Sheet.Rows[rowcnt].Interior.Color := clpurple;
            inc(rowcnt);
            CheckEndStr:=Trim(Sheet.cells[rowcnt,1]) ;
            error:=1;
            Break;
           end;
        end;
        if error=1 then
        begin
        error:=0;
        Continue;
        end;
        if yanzheng(dpbh) then      //验证店铺代码是否存在,并且是否判断是否允许零售结算
          begin
           if ClientDataSet1.FieldByName('byzd3').AsString='1' then ll:='1' else ll:='0';  //判断excel中的店铺是否允许进行结算
           if ClientDataSet1.IsEmpty then
           begin
              Sheet.Rows[rowcnt].Interior.Color := clblue;
              inc(rowcnt);
              CheckEndStr:=Trim(Sheet.cells[rowcnt,1]) ;
              error:=1;
           end;          end;
       if error=1 then
        begin
        error:=0;
        Continue;
        end;
       if  (delu = g_User.strQddm) or (g_User.strQddm='000') then
       begin
       if not g_ChkSpGg1Input(DmReturn,strSpdm) then    //判断颜色是否正确,不正确excel行颜色变化
        begin
        if g_MainInfo3.IntBYZD10=1 then       //系统辅助信息(声音报警控制信息)
            Sheet.Rows[rowcnt].Interior.Color := clyellow;
          inc(rowcnt);
          CheckEndStr:=Trim(Sheet.cells[rowcnt,1]) ;
          error:=1;
        if error=1 then
          begin
          error:=0;
          Continue;
          end;        end ;        strSql:='SELECT SPGG2.GGDM,GUIGE2.GGWZ2 FROM GUIGE2,SPGG2 '
               +' WHERE SPGG2.GGDM=GUIGE2.GGDM AND SPGG2.SPDM='''+Trim(Sheet.Cells[rowcnt,3])
               +''' ORDER BY GUIGE2.GGWZ2';
        DataMain.SelectSql(strSql,GgQry);
        n:=0;
        While not GgQry.Eof do           //18行  ,循环18次
        begin          TmpInt:=GgQry.Fields[1].AsInteger;     //找出商品的列位置 (数据表)
          if  (Trim(Sheet.Cells[rowcnt,TmpInt+4])<>'') and (StrToIntDef(Trim(Sheet.Cells[rowcnt,TmpInt+4]),0)<>0) and (TmpInt<=g_Kzgg.ColsCnt) then    //尺码列数<=拓展列的信息列数
          begin
          strGg2dm:=GgQry.Fields[0].asstring ;
          sl1 :=Trim(Sheet.Cells[rowcnt,TmpInt+4]) ; //取数量
          if sl1<>'' then
          begin
          sl:=sl+sl1;           bzj:=Trim(Sheet.Cells[rowcnt,CmEndCol+1]);
           dj:=Trim(Sheet.Cells[rowcnt,CmEndCol+2]);
           zk:=FormatFloat('0.00',strtofloat(dj)/strtofloat(bzj));
           vip:=Trim(Sheet.Cells[rowcnt,CmEndCol+3]);
           bz:=Trim(Sheet.Cells[rowcnt,CmEndCol+4]);
 if i>1 then
                 begin
                   str2:=' select djbh  from ( '+str1+' ) s where xsrq='''+xsrq+''' and dpbh='''+dpbh+'''';
                   DataMain.SelectSql(str2,dcshangpin);
                 end;
            if  (dcshangpin.IsEmpty) or (i=1) then
                   begin
                   FDjCodeInfo.strdjmc :='lsxhd' ;
                          smod:='select * from DJBHWH where djmc='''+FDjCodeInfo.strdjmc+''' and dm='''+dpbh+'''';
                          DataMain.SelectSql(smod,cs);
                          FDjCodeInfo.strMode:=cs.Fields[0].AsString;
                          FDjCodeInfo.strDm:=dpbh;
                   if DataMain.GetDjBh(FDjCodeInfo)<>'0' then
                   begin
                   exit;
                   end;
                     djbh:='LS'+FDjCodeInfo.strdjbh ;
                     mibh:=0;
                     mibh:=mibh+1;
                     strSql:=' select '''+xsrq+''' as xsrq,'''+dpbh+''' as dpbh,'''+djbh+''' as djbh ' ;
                     str1:=strSql+' union '+str1;
                   if i=1 then str1:=strSql;
                   end
            else
                   begin
                    djbh:=dcshangpin.fieldbyname('djbh').asstring;
                    mibh:=mibh+1;
                   end;
        StringGrid1.Cells[0,i]:=IntToStr(i);
          StringGrid1.Cells[1,i]:=djbh;
          StringGrid1.cells[2,i]:=xsrq;
          StringGrid1.cells[3,i]:=dpbh;
          StringGrid1.Cells[4,i]:=strSpdm;
          StringGrid1.Cells[5,i]:=strGg1dm;
          StringGrid1.Cells[6,i]:=strGg2dm;
          StringGrid1.Cells[7,i]:=sl;
          StringGrid1.Cells[8,i]:=bzj;
          StringGrid1.Cells[9,i]:=zk;
          if StringGrid1.Cells[10,0] ='' then StringGrid1.Cells[10,0]:='0';
          StringGrid1.Cells[10,i]:=dj;
          StringGrid1.Cells[11,i]:=vip;
          StringGrid1.Cells[12,i]:=bz;
          StringGrid1.Cells[13,i]:=IntToStr(mibh);
//判断商品及款式尺码颜色是否正确
          spstr:='select a.spdm,b.ggdm gg1dm,c.ggdm gg2dm  from shangpin  a  inner join spgg1 b on a.spdm=b.spdm inner join spgg2 c on a.spdm=c.spdm '
             +' where a.spdm='''+StringGrid1.Cells[4,i]+''' and b.ggdm='''+StringGrid1.Cells[5,i]+''' and c.ggdm='''+StringGrid1.Cells[6,i]+''' ';
          DataMain.SelectSql(spstr,dcshangpin);
          if dcshangpin.IsEmpty then
          begin
                Sheet.Rows[rowcnt].Interior.Color := clyellow;
                error:=1;
          end;
          if error=1 then
          begin
              error:=0;
              Continue;
          end;
          inc(i);
          sl:='';
          StringGrid1.RowCount:=StringGrid1.RowCount+1;
          end;          end;
          GgQry.Next ;
        end;
        inc(rowcnt);
        CheckEndStr:=Trim(Sheet.cells[rowcnt,1]) ;
        end;
       finally
        FreeAndNil(GgQry);
        FreeAndNil(cs);
        FreeAndNil(qdcs);
        FreeAndNil(cdcs);
        FreeAndNil(dcshangpin);
       end;
      end ;
    end;
   StringGrid1.RowCount:=StringGrid1.RowCount-1;
    Screen.Cursor:=crDefault;    ExcelApp.ActiveWorkBook.Save;
    ExcelApp.workbooks.close;
    ExcelApp.quit;
end ;