// 保存 GRID 内容到 EXCEL2000 文件 function tdm.SaveExcel2(fn:string; grid:TDBGrid ):boolean; var excel,book,sheet : variant; i:integer; colIndex, fldIndex : Array[0..255] of integer; colCount : Integer; rec : _Recordset; // grid : TDBGrid; procedure setvalue(i,j:integer; v:variant) ; // 在单元格写入值 begin sheet.cells[i,j].value := v; end; function FindColumn(idx : Integer):Integer; // 查找需要的列现在在何处 begin result := 0; while result<255 do begin if fldIndex[result]=idx then begin exit; end; inc(result); end; end; procedure MoveColumn(fc,tc : Integer); // 移动某列到某处 var tmp,v : Integer; begin Sheet.Columns[fc+1].Cut; Sheet.Columns[tc+1].Insert(-4161); v := fldIndex[fc]; for tmp:=fc downto tc+1 do fldIndex[tmp] := fldIndex[tmp-1]; fldIndex[tc] := v; end; begin result := false; try // 显示沙漏光标 screen.Cursor := -11; try excel := createoleobject('excel.application'); except dm.ShowErr(noExcel); exit; end; book := excel.workbooks.add; sheet := book.worksheets.item[1]; // excel.visible:=true; rec := (grid.DataSource.DataSet as TAdoquery).Recordset; for i := rec.Fields.Count-1 downto 0 do // 第一行标题 begin setvalue(1,i+1,rec.Fields[i].Name); end; sheet.cells[2,1].CopyFromRecordset( rec ); // 内容 // 此处调整列顺序 for i:=0 to rec.Fields.Count-1 do fldIndex[i] := i; ColCount := 0; for i:=0 to grid.Columns.Count-1 do begin if grid.Columns[i].Visible then begin colIndex[colCount] := grid.Columns[i].Field.Index; inc(colCount); end; end; for i:=0 to colCount-1 do begin if colIndex[i]<>fldIndex[i] then begin MoveColumn( findColumn(colIndex[i]),i ); end; end; for i:=1 to colCount do begin sheet.columns[i].autofit; end; for i:=colCount to rec.Fields.Count-1 do begin sheet.columns[colCount+1].delete; end; try book.saveas( fn ); book.close; except excel.visible:=true; end; finally screen.Cursor := 0; end; excel.quit; result:=true; end; |