delphi dbgrideh导出到Excel 多表头

找了好多资料,处理dbgrideh导出Excel多表头的情况。终于找到解决方法。有修改的话请联系我:QQ:826575071

引用单元

interface
  uses Vcl.ComCtrls,Winapi.CommCtrl,System.Win.ComObj,DBGridEh,Vcl.Forms;
implementation
  uses StrUtils,SysUtils,Vcl.Dialogs,Vcl.Controls,Data.DB,Variants;

正文如下:

procedure ExportToExcel(dbgrideh1:TDBGridEh;TitleName :String;autoFit:Boolean);

function isFloat(str :String):Boolean;
begin
  try
    StrToFloat(str);
  except
    Result := False;
  end;
  Result := True;
end;
function getSpecCount(substr, str: String): integer;
var i,count :integer;
begin
  i := 0;
  count := 1;
  while pos(substr,str)>0 do
  begin
    i := pos(substr,str);
    count := count + 1;
    str := RightStr(str,length(str)-i);
  end;
  result := count;
end;


function getSpaceI(sheet:Variant;row,col:integer):Integer;
var i:integer;
begin
  for I := row downto 2 do//首行为标题行
    if Sheet.cells[i, col].Value <> '' then
      break;
  result := i;
end;
var XLApp: Variant;
  Sheet: Variant; s1, s2: string;
  Caption: String; Row, Col: integer;
  iCount, jCount: Integer;
  FBookMark: TBookmark; FileName: String;
  SaveDialog1: TSaveDialog;
  i,ii,max :Integer; ti:TColumnTitleEh;
begin //如果数据集为空或没有打开则退出
  if not DBGridEh1.DataSource.DataSet.Active then Exit;
  SaveDialog1 := TSaveDialog.Create(Nil);
  SaveDialog1.FileName := TitleName + '_' + FormatDateTime('YYMMDDhhmmss', now);
  SaveDialog1.Filter := 'Excel文件|*.xls';
  if SaveDialog1.Execute then FileName := SaveDialog1.FileName;
  SaveDialog1.Free;
  if FileName = '' then Exit;
  Application.ProcessMessages;
  Screen.Cursor := crHourGlass; //鼠标指针为沙漏状
  if not VarIsEmpty(XLApp) then
  begin
    XLApp.DisplayAlerts := False;
    XLApp.Quit; VarClear(XLApp);
  end; //通过ole创建Excel对象
  try
    XLApp := CreateOleObject('Excel.Application');
  except
    MessageDlg('创建Excel对象失败,请检查你的系统是否正确安装了Excel软件!', mtError, [mbOk], 0);
    Screen.Cursor := crDefault;
    Exit;
  end; //生成工作页
  //XLApp.WorkBooks.Add[XLWBatWorksheet];
  //XLApp.WorkBooks[1].WorkSheets[1].Name := TitleName;
  //XLApp.Visible := True; //调试显示用
  XLApp.WorkBooks.Add;
  Sheet := XLApp.WorkSheets[1]; //写标题
  sheet.cells[1, 1] := TitleName;
  sheet.range[sheet.cells[1, 1], sheet.cells[1, DBGridEh1.Columns.Count]].Select; //选择该列
  XLApp.selection.HorizontalAlignment := 3; //居中
  XLApp.selection.MergeCells := True; //合并 //写表头
  Row := 1;
  for I := 0 to dbgrideh1.Columns.Count - 1 do
  begin
    ti := dbgrideh1.Columns[i].Title;
    ii := getSpecCount('|',ti.Caption) + 1;
    if Max < ii then
      Max := ii;
  end;
  jCount := max;
  for iCount := 0 to DBGridEh1.Columns.Count - 1 do
  begin
    Col := 2;
    Row := iCount+1;
    Caption := DBGridEh1.Columns[iCount].Title.Caption;
    while POS('|', Caption) > 0 do
    begin
      jCount := max+1;
      s1 := Copy(Caption, 1, Pos('|',Caption)-1);
      if s2 = s1 then
      begin
        sheet.range[sheet.cells[Col, Row-1],sheet.cells[Col, Row]].Select;
        XLApp.selection.HorizontalAlignment := 4;//$FFFFEFF4;
        XLApp.selection.MergeCells := True;
      end
      else Sheet.cells[Col,Row] := Copy(Caption, 1, Pos('|',Caption)-1);
      Caption := Copy(Caption,Pos('|', Caption)+1, Length(Caption));
      Inc(Col);
      s2 := s1;
    end;
    Sheet.cells[Col, Row] := Caption;
    Inc(Row);
  end; //合并表头并居中
  if jCount = max+1 then
    for iCount := 1 to DBGridEh1.Columns.Count do
      if Sheet.cells[max, iCount].Value = '' then
      begin
        i := getSpaceI(Sheet,max,iCount);
        sheet.range[sheet.cells[i{max-1}, iCount],sheet.cells[max, iCount]].Select;
        XLApp.selection.HorizontalAlignment := 4;//$FFFFEFF4;
        XLApp.selection.MergeCells := True;
      end
      else
      begin
        sheet.cells[max, iCount].Select;
        XLApp.selection.HorizontalAlignment := 3;//$FFFFEFF4;
      end; //读取数据
  DBGridEh1.DataSource.DataSet.DisableControls;
  FBookMark := DBGridEh1.DataSource.DataSet.GetBookmark;
  DBGridEh1.DataSource.DataSet.First;
  while not DBGridEh1.DataSource.DataSet.Eof do
  begin
    for iCount := 1 to DBGridEh1.Columns.Count do
    begin
      Sheet.cells[jCount, iCount] := DBGridEh1.Columns.Items[iCount-1].Field.AsString;
      if (Pos('.',DBGridEh1.Columns.Items[iCount-1].Field.AsString)>0)
        and isFloat(DBGridEh1.Columns.Items[iCount-1].Field.AsString) then
          Sheet.cells[jCount, iCount].numberformatlocal:=OleVariant('0.00');
    end;
    Inc(jCount);
    DBGridEh1.DataSource.DataSet.Next;
  end;
  if DBGridEh1.DataSource.DataSet.BookmarkValid(FBookMark) then
  DBGridEh1.DataSource.DataSet.GotoBookmark(FBookMark);
  DBGridEh1.DataSource.DataSet.EnableControls; //读取表脚
  if DBGridEh1.FooterRowCount > 0 then
  begin
    for Row := 0 to DBGridEh1.FooterRowCount-1 do
    begin
      for Col := 0 to DBGridEh1.Columns.Count-1 do
        Sheet.cells[jCount, Col+1] := DBGridEh1.GetFooterValue(Row,DBGridEh1.Columns[Col]);
      Inc(jCount);
    end;
  end; //调整列宽
  if autoFit then
    for iCount := 1 to DBGridEh1.Columns.Count do
      Sheet.Columns[iCount].EntireColumn.AutoFit;
  sheet.cells[1, 1].Select;
  XlApp.Visible := True;
  XlApp.Workbooks[1].SaveAs(FileName);
  XlApp := Unassigned;
  Screen.Cursor := crDefault;
end;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值