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 ;
代码释放打开的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 ;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货