Delphi Excel操作,写了个ADODataSet转Excel的函数


本文整理自网络,侵删。

 
使用该函数需要先Use Excel2010
//DataSet导出Excel2010格式<br>//FileName=待导出的Excel的文件名,不带路径以及后缀;TitleLine1=导出后Excel第一表头,TitleLine2=Excel第二表头;CellsNames=Excel表格中Field的Title名称;<br>//IsOpen=是否马上打开
procedure sysDSetToXlsx(DSet: TADODataSet;FileName,TitleLine1,TitleLine2:String;
  CellsNames: TStringList; IsOpen: Boolean = False);      
var
  ExcelApp: TExcelApplication;
  ExcelWorkBook: TExcelWorkbook;
  ExcelWorkSheet: TExcelWorksheet;
  Range: OleVariant;
  I,RecNo: Integer;
  TmpPath: string;
begin
  try
    ExcelApp := TExcelApplication.Create(nil);
    ExcelWorkBook := TExcelWorkbook.Create(nil);
    ExcelWorkSheet := TExcelWorksheet.Create(nil);
  except
    msgRaise('没有安装office 2007或以上版本,请安装后再试');
  end;
  //创建Excel
  ExcelApp.Connect;
  ExcelApp.Workbooks.Add(null,0);
  ExcelWorkBook.ConnectTo(ExcelApp.Workbooks[1]);
  ExcelWorkSheet.ConnectTo(ExcelWorkBook.Worksheets[1] as _WorkSheet);
  //构造Excel表头
  Range := ExcelApp.Range[ExcelWorkSheet.Cells.Item[1,1],ExcelWorkSheet.Cells.Item[2,CellsNames.Count]];
  Range.MergeCells := True;
  Range.Font.Size := 18;
  Range.Font.Bold := True;
  Range.HorizontalAlignment := 3;   //横向居中,此处如果使用xlCenter报“类Range” 错误 
  Range.VerticalAlignment := 2;    //竖向居中,此处如果使用xlCenter报“类Range” 错误
  Range.RowHeight := 40;
  Range.Cells[1,1] := TitleLine1;     //表头第一行
 
  Range := ExcelApp.Range[ExcelWorkSheet.Cells.Item[3,1],ExcelWorkSheet.Cells.Item[3,CellsNames.Count]];
  Range.MergeCells := True;      //合并
  Range.Font.Size := 10;
  Range.Font.Bold := True;
  Range.HorizontalAlignment := 4;  //同上错误
  Range.VerticalAlignment := 2;   //同上错误 
  Range.RowHeight := 20;
  Range.Cells[1,1] := TitleLine2;     //表头第二行
  Range.Cells[3,1].Select;            //此处两行代码用于冻结头两行
  ExcelApp.ActiveWindow.FreezePanes := True;


  for I := 1 to CellsNames.Count do
  begin
    Range.Cells[2,I] := CellsNames.Names[I-1];       //需与DSet的Fields顺序保持一致
    Range.Columns[I].ColumnWidth  := CellsNames.Values[CellsNames.Names[I-1]];  //Excel文件中的单元格宽,单位为字符.
  end;
 
  RecNo := DSet.RecNo;
  DSet.DisableControls;
  DSet.First;
  while not DSet.Eof do
  begin
    for I := 1 to CellsNames.Count do
      Range.Cells[DSet.RecNo + 2, I] := VarToStr(DSet.Fields[I-1].Value);
    DSet.Next;
  end;
  DSet.RecNo := RecNo;
  DSet.EnableControls;
 
  TmpPath := sysGetPath(HInstance) + 'xls\';    //sysGetPath=自定义函数,获取当前路径
  if not DirectoryExists(TmpPath) then
    ForceDirectories(TmpPath);
  ExcelWorkSheet.SaveAs(TmpPath + FileName + '.xlsx');
 
  ExcelWorkSheet.Disconnect;
  ExcelWorkBook.Disconnect;
  ExcelApp.Quit;    //这句比较重要,很多例子中没有这句,关闭后,进程中还是能够发现Excel进程没有关闭
  ExcelApp.Disconnect;
  FreeAndNil(ExcelWorkSheet);
  FreeAndNil(ExcelWorkBook);
  FreeAndNil(ExcelApp);
 
  if IsOpen then
    sysExecuteFile(TmpPath + FileName + '.xlsx','','',0);
end;

相关阅读 >>

Delphi从excel读取数据存入数据库demo

Delphi 操作sql 插入一万条数据 三种方式速度测试

Delphi 根据文本高度确定richedit高度

Delphi timer定时器 实现定时执行

Delphi 2009 新增单元 character[1]: toupper、tolower - 字符与字符串的大小写转换

Delphi 之 tpagecontrol组件

Delphi xe 横屏竖屏的管理

Delphi getdesktopdir 获取桌面路径

Delphi清除ie临时文件,历史记录

Delphi 连接dbf数据

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...