delphi将当前dbgrid中数据导出到excel中
请问能不能将dbgrid中的内容导出来,并且插入到已有表的固定位置?比如说,将内容插到先有一excel的从A7 开始往下的位置。A7 往上是我在excel 中做的一些东西,不能从dbgrid 中取出来,并且不成行成列的数据。
[解决办法]
- Delphi(Pascal) code
procedure DataSetToExcel(MydataSet:tdataset);var FileHandle : Integer; tt:string; x,y:integer; SaveDialog1:TSaveDialog; xlapp, xlsheet: variant; begin try xlapp := createoleobject('excel.application'); except showmessage('您的系统没有安装MS EXCEL!'); exit; end; if MydataSet.Active=false then exit; if MydataSet.RecordCount<1 then exit ; SaveDialog1:=TSaveDialog.Create(MydataSet.Owner); SaveDialog1.FileName:=''; SaveDialog1.Filter:='Excel files (*.xls) | *.xls'; SaveDialog1.DefaultExt:='xls'; SaveDialog1.Execute; tt:=SaveDialog1.FileName; if tt='' then exit; if Fileexists(tt) then begin if MessageDLG('文件已存在,确认覆盖?',mtWarning,[mbOK,mbCancel],0) = mrOk then begin Deletefile(tt); Screen.Cursor := crHourGlass; FileHandle := Xls_Create(tt); Xls_SetFormat(FileHandle,'yyyy-mm-dd hh:mm:ss'); with MydataSet do begin Open; DisableControls; First; for y:= 0 to FieldCount-1 do Xls_SetString(FileHandle, 0, y,Fields[y].FieldName); for x:=0 to RecordCount-1 do begin for y:=0 to FieldCount-1 do begin if FieldTypeNames[Fields[y].datatype]='WideString' then Xls_SetString(FileHandle, x+1, y,Fields[y].AsString) else if FieldTypeNames[Fields[y].datatype]='LargeInt' then Xls_SetInteger(FileHandle, x+1, y,Fields[y].Asinteger) else if FieldTypeNames[Fields[y].datatype]='Integer' then Xls_SetInteger(FileHandle, x+1, y,Fields[y].Asinteger) else if FieldTypeNames[Fields[y].datatype]='BCD' then Xls_SetDouble(FileHandle, x+1, y,Fields[y].Asfloat) else Xls_SetString(FileHandle, x+1, y,Fields[y].AsString); Application.ProcessMessages; end; next; end; first; EnableControls; end; Xls_Close (FileHandle); Screen.Cursor := crDefault; Application.MessageBox('数据导出完毕!','信息',MB_OK); end; end else begin Screen.Cursor := crHourGlass; FileHandle := Xls_Create(tt); Xls_SetFormat(FileHandle,'yyyy-mm-dd hh:mm:ss'); with MydataSet do begin Open; DisableControls; First; for y:= 0 to FieldCount-1 do Xls_SetString(FileHandle, 0, y,Fields[y].FieldName); for x:=0 to RecordCount-1 do begin for y:=0 to FieldCount-1 do begin if FieldTypeNames[Fields[y].datatype]='WideString' then Xls_SetString(FileHandle, x+1, y,Fields[y].AsString) else if FieldTypeNames[Fields[y].datatype]='LargeInt' then Xls_SetInteger(FileHandle, x+1, y,Fields[y].Asinteger) else if FieldTypeNames[Fields[y].datatype]='Integer' then Xls_SetInteger(FileHandle, x+1, y,Fields[y].Asinteger) else if FieldTypeNames[Fields[y].datatype]='BCD' then Xls_SetDouble(FileHandle, x+1, y,Fields[y].Asfloat) else Xls_SetString(FileHandle, x+1, y,Fields[y].AsString); Application.ProcessMessages; end; next; end; first; EnableControls; end; Xls_Close (FileHandle); Screen.Cursor := crDefault; Application.MessageBox('数据导出完毕!','信息',MB_OK); end; //打开刚刚导出成功的EXCEL文件,函数ShellExecute为系统函数,在ShellAPI中,需引号 ShellExecute(FileHandle, 'open', PChar(tt), nil, nil, SW_SHOW);end;去找一下Xls,MyClass类