用OLE,可以像Dbgrid一样,从数据集中循环读数据,再写入Excel对应的单元格中

解决方案 »

  1.   

    从dbgrid导出数据到excel的例子,实际继承dbgrid的控件都可以这样使用:unit UMain;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, DBTables, StdCtrls, Grids, DBGrids,Excel97,Comctrls,OleCtnrs,ComObj,word97;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        Button1: TButton;
        Button2: TButton;
        DataSource1: TDataSource;
        Table1: TTable;
        SaveDialog1: TSaveDialog;
        Button3: TButton;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        XlsApp,XlsSheet,XlsWBk : Variant;
        WordApp : Variant;
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
      I,J : integer;
    begin
      if VarIsEmpty(XlsApp) then
        XlsApp := CreateOleObject('Excel.Application');  XLsApp.Workbooks.Add;
      XlsSheet := XLsApp.Worksheets['Sheet1'];  for I := 0 to Table1.Fields.Count - 1 do
      begin
        XlsSheet.Cells[3,I + 1] := dbgrid1.Columns[I].Title.Caption;
      end;  Table1.first;
      for J := 0 to Table1.RecordCount - 1 do
      begin
        if DBGrid1.SelectedRows.CurrentRowSelected then
        begin
          for I := 0 to Table1.Fields.Count - 1 do
          begin
            XlsSheet.Cells[J + 4,I + 1] := Table1.Fields[I].AsString;
          end;
        end;
        Table1.Next;
      end;  if savedialog1.Execute then
        xlssheet.saveas(savedialog1.FileName);  XlsApp.Visible := true;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      I,J : integer;
      TxtFile : TextFile;
      TmpString : String;
    begin
      try
        if VarIsEmpty(XlsApp) then
          XlsApp := CreateOleObject('Excel.Application');
        XlsSheet := XlsApp.workbooks.open('c:\my documents\book3.xls');    AssignFile(TxtFile,'C:\My Documents\Test.txt');
        Rewrite(TxtFile);
        try
          for I := 3 to 21 do
          begin
            TmpString := '';
            for J := 1 to 5 do
            begin
              TmpString := TmpString + XlsSheet.ActiveSheet.Cells[I,J].Text + '|';
            end;
            Writeln(TxtFile,Tmpstring);
          end;
        finally
          CloseFile(TxtFile);
        end;
        XlsApp.Visible := true;
      except
        XlsSheet.close;
        XlsApp.Application.quit;
        XlsApp := Unassigned;
        XlsSheet := Unassigned;
      end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if not VarIsEmpty(XlsApp) then
      begin
        XlsApp.DisplayAlerts := True;  // 7Discard unsaved files....
        try
          XlsApp.Application.Quit;
          XlsApp := Unassigned;
          XlsSheet := Unassigned;
        except
        end;
      end;  if not VarIsEmpty(WordApp) then
      begin
        WordApp.DisplayAlerts := True;  // 7Discard unsaved files....
        try
          WordApp.Application.Quit;
          WordApp := Unassigned;
        except
        end;
      end;end;procedure TForm1.Button3Click(Sender: TObject);
    var
      WordDoc,WordParagraph,WordRange,WordTable:variant;
      SltRec,SltCol,VisCol :integer;
      ColIndex,RowIndex : Integer;
      I,J : integer;
      PrintAll : Boolean;
    begin
      try
        if VarIsEmpty(WordApp) then
          WordApp := CreateOleObject('word.Application');    WordDoc := WordApp.documents.add;
        WordParagraph := WordApp.activedocument.paragraphs.add;    WordRange := WordParagraph.range;
        WordRange.Font.Size := 18;
        WordRange.Font.Name := '宋体';
      except
        Application.MessageBox(pchar('Ms Word 无法启动,数据转入终止!'),pchar('注意'),mb_ok);
        Abort;
      end;  if DBGrid1.SelectedRows.Count <> 0 then
        SltRec:= DBGrid1.SelectedRows.Count
      else
        SltRec := Table1.RecordCount;  SltCol := DBGrid1.Columns.Count;  WordRange := WordApp.ActiveDocument.Content;
      WordRange.Collapse(wdCollapseEnd);
      WordTable:= WordApp.activedocument.tables.add(WordRange,SltRec + 1,SltCol);  {打印表头}
      for  j := 0 to SltCol-1  do
      begin
        WordTable.columns[j].setwidth(100,1); 
        WordTable.Cell(1,J+1).Range.InsertAfter(dbgrid1.Columns[j].Title.Caption);
      end;  //打印数据
      Table1.First;
      RowIndex := 2;
      ColIndex := 1;
      while not Table1.Eof do
      begin
        if dbgrid1.SelectedRows.CurrentRowSelected then
        begin
          for j := 0 to dbgrid1.Columns.Count-1 do
          begin
            WordTable.Cell(RowIndex,ColIndex).Range.InsertAfter
                (table1.Fieldbyname(dbgrid1.Columns[j].FieldName).asstring);
              ColIndex := ColIndex + 1;
          end;
          RowIndex := RowIndex + 1;
          ColIndex := 1;
        end;    Table1.Next;
      end;{End of While...not...}  if savedialog1.Execute then
        WordDoc.saveas(savedialog1.FileName);  WordApp.Visible := true;
    end;procedure TForm1.Button4Click(Sender: TObject);
    var
      i : integer;
    begin
      for I := 0 to Table1.RecordCount - 1 do
      begin
        DBGrid1.SelectedRows.CurrentRowSelected := true;
        Table1.Next;
      end;
    end;end.
      

  2.   

    老兄,我不会Delphi把我叫来干什么?
      

  3.   

    下次你的名字要注明你不会delphi
      

  4.   

    还是没人能解决我这个问题(主  题:  Ehlib 的 DBGridEh 控件怎样才能像 dxDBGrid 控件那样输出文件到 EXCEL ? )
      

  5.   

    我刚刚改写了一个控件,可以解决你的问题:源码如下
    第一部分:
    unit DBGridEhExport;interfaceuses
      SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Db, DBGrids, Comobj,DBGridEh, extctrls, comctrls, ActiveX;type
      TSpaceMark = (csComma, csSemicolon, csTab, csBlank, csEnter);  TDBGridEhExport = class(TComponent)
      private
        FDB_Grid: TDBGridEh;                                      {读取DBGrideh的源}    FTxtFileName: string;                                   {文本文件名}
        FSpaceMark: TSpaceMark;                                 {间隔符号}
        FSpace_Ord: Integer;                                    {间隔符号的Asc数值}
        FTitle: string;                                         {显示的标题}
        FSheetName: string;                                     {工作表标题}
        FExcel_Handle: OleVariant;                              {Excel的句柄}    FWorkbook_Handle: OleVariant;                           {书签的句柄}    FShow_Progress: Boolean;                                {是否显示插入进度}    FProgress_Form: TForm;                                  {进度窗体}
        FRun_Excel_Form: TForm;                                 {启动Excel提示窗口}
        FProgressBar: TProgressBar;                             {进度条}    function Connect_Excel: Boolean;                        {启动Excel}
        function New_Workbook: Boolean;                         {插入新的工作博}
        function InsertData_To_Excel: Boolean;                  {插入数据}
        procedure Create_ProgressForm(AOwner: TComponent);      {创建进度显示窗口}
        procedure Create_Run_Excel_Form(AOwner: TComponent);    {创建启动Excel窗口}
        procedure SetSpaceMark(Value: TSpaceMark);              {设置导出时的间隔符号}
      protected
      public
        constructor Create(AOwner: TComponent); override;       {新建}
        destructor Destroy; override;                           {销毁}
        function Export_To_Excel: Boolean; overload;            {导出到Excel中}
        function Export_To_Excel(DB_Grid: TDBGridEh): Boolean; overload;    function Export_To_Txt(NewFile: Boolean = True): Boolean; overload; {导出到文本文件中}
        function Export_To_Txt(FileName: string; NewFile: Boolean = True): Boolean; overload;
        function Export_To_Txt(DB_Grid: TDBGridEh; NewFile: Boolean = True): Boolean; overload;
        function Export_To_Txt(FileName: string; DB_Grid: TDBGridEh; NewFile: Boolean = True): Boolean; overload;  published
        property DB_Grid: TDBGridEh read FDB_Grid write FDB_Grid;
        property Show_Progress: Boolean read FShow_Progress write FShow_Progress;
        property TxtFileName: string read FTxtFileName write FTxtFileName;
        property SpaceMark: TSpaceMark read FSpaceMark write SetSpaceMark;
        property Title: string read FTitle write FTitle;
        property SheetName: string read FSheetName write FSheetName;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Stone', [TDBGridEhExport]);
    end;{-------------------------------------------------------------------------------}
    {新建}
    constructor TDBGridEhExport.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FShow_Progress := True;
      FSpaceMark := csTab;
    end;{销毁}
    destructor TDBGridEhExport.Destroy;
    begin
      varClear(FExcel_Handle);
      varClear(FWorkbook_Handle);
      inherited Destroy;
    end;
      

  6.   

    第二部分:{===============================================================================}
    {导出到文本文件中}
    function TDBGridEhExport.Export_To_Txt(NewFile: Boolean = True): Boolean;
    var
      Txt: TStrings;
      Tmp_Str: string;
      data_Str: string;
      i, j: Integer;
      Column_name: string;
      Data_Set: TDataSet;  book: pointer;
      Before_Scroll, Afrer_Scroll: TDataSetNotifyEvent;
    begin
      Result := False;  if NewFile = True then
        FTxtFileName := '';
      if FTxtFileName = '' then
      begin
        with TSaveDialog.Create(nil) do
        begin
          Title := '请选择输出文件名';
          DefaultExt := 'txt';
          Filter := '文本文件(*.Txt)|*.txt';
          Options := [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofEnableSizing];
          if Execute then
            FTxtFileName := FileName;
          Free;
          if FTxtFileName = '' then                             {如果没有选中文件,则直接推出}
            exit;
        end;    if FTxtFileName = '' then
        begin
          raise exception.Create('没有指定输出文件');
          Exit;
        end;  end;  if FDB_Grid = nil then
        raise exception.Create('请输入DBGrideh名称');  Txt := TStringList.Create;
      try
        {显示插入进度}
        if FShow_Progress = True then
        begin
          Create_ProgressForm(nil);
          FProgress_Form.Show;
        end;    {第一行,插入标题}
        Tmp_Str := '';                                          //FDB_Grid.Columns[0].Title.Caption;
        for i := 1 to FDB_Grid.Columns.Count do
          if FDB_Grid.Columns[i - 1].Visible = True then
            Tmp_Str := Tmp_Str + FDB_Grid.Columns[i - 1].Title.Caption + Chr(FSpace_Ord);    Tmp_Str := Copy(Tmp_Str, 1, Length(Tmp_Str) - 1);    Txt.Add(Tmp_Str);   {插入DBGrideh中的数据}
        Data_Set := FDB_Grid.DataSource.DataSet;
       {记忆当前位置并取消任何事件}
    //  new(book);
        book := Data_Set.GetBook;    Data_Set.DisableControls;
        Before_Scroll := Data_Set.BeforeScroll;
        Afrer_Scroll := Data_Set.AfterScroll;
        Data_Set.BeforeScroll := nil;
        Data_Set.AfterScroll := nil;    if FShow_Progress = True then
        begin
          Data_Set.Last;
          FProgress_Form.Refresh;
          FProgressBar.Max := Data_Set.RecordCount;
        end;    {插入DBGrid中的所有字段}
        Data_Set.First;    j := 2;
        while not Data_Set.Eof do
        begin
          if FShow_Progress = True then
            FProgressBar.Position := j - 2;      Column_name := FDB_Grid.Columns[0].FieldName;
          Tmp_Str := '';                                        //Data_Set.FieldByName(Column_name).AsString;
          for i := 1 to FDB_Grid.Columns.Count do
            if FDB_Grid.Columns[i - 1].Visible = True then
            begin
              data_Str := FDB_Grid.Fields[i - 1].DisplayText;
              Tmp_Str := Tmp_Str + data_Str + Chr(FSpace_Ord);
            end;      Tmp_Str := Copy(Tmp_Str, 1, Length(Tmp_Str) - 1);
          Txt.Add(Tmp_Str);      j := j + 1;
          Data_Set.Next;
        end;    {恢复原始事件以及标志位置}
        Data_Set.GotoBook(book);
        Data_Set.FreeBook(book);
    //  dispose(book);
        Data_Set.EnableControls;
        Data_Set.BeforeScroll := Before_Scroll;
        Data_Set.AfterScroll := Afrer_Scroll;    {写到文件}
        Txt.SaveToFile(FTxtFileName);
        Result := True;
      finally
        Txt.Free;
        if FShow_Progress = True then
        begin
          FProgress_Form.Free;
          FProgress_Form := nil;
        end;
      end;
    end;
      

  7.   

    第三部分:function TDBGridEhExport.Export_To_Txt(FileName: string; NewFile: Boolean = True): Boolean;
    begin
      FTxtFileName := FileName;
      Result := Export_To_Txt(NewFile);
    end;function TDBGridEhExport.Export_To_Txt(DB_Grid: TDBGridEh; NewFile: Boolean = True): Boolean;
    begin
      FDB_Grid := DB_Grid;
      Result := Export_To_Txt(NewFile);
    end;function TDBGridEhExport.Export_To_Txt(FileName: string; DB_Grid: TDBGridEh; NewFile: Boolean = True): Boolean;
    begin
      FTxtFileName := FileName;
      FDB_Grid := DB_Grid;
      Result := Export_To_Txt(NewFile);
    end;{-------------------------------------------------------------------------------}
    {设置导出时的间隔符号}
    procedure TDBGridEhExport.SetSpaceMark(Value: TSpaceMark);
    begin
      FSpaceMark := Value;
      case Value of
        csComma: FSpace_Ord := ord(',');
        csSemicolon: FSpace_Ord := ord(';');
        csTab: FSpace_Ord := 9;
        csBlank: FSpace_Ord := 32;
        csEnter: FSpace_Ord := 13;
      end;
    end;
    {===============================================================================}
    {导出到Excel中}
    function TDBGridEhExport.Export_To_Excel: Boolean;
    begin
      if FDB_Grid = nil then
        raise exception.Create('请输入DBGrid名称');  Result := False;
      if Connect_Excel = True then
        if New_Workbook = True then
          if InsertData_To_Excel = True then
            Result := True;
    end;function TDBGridEhExport.Export_To_Excel(DB_Grid: TDBGridEh): Boolean;
    begin
      FDB_Grid := DB_Grid;
      Result := Export_To_Excel;
    end;
    {-------------------------------------------------------------------------------}
    {启动Excel}
    function TDBGridEhExport.Connect_Excel: Boolean;
      {连接Ole对象}
      function My_GetActiveOleObject(const ClassName: string; out Ole_Handle: IDispatch): Boolean;
      var                                                       //IDispatch
        ClassID: TCLSID;
        Unknown: IUnknown;
        l_Result: HResult;
      begin
        Result := False;    l_Result := CLSIDFromProgID(PWideChar(WideString(ClassName)), ClassID);
        if (l_Result and $80000000) = 0 then
        begin
          l_Result := GetActiveObject(ClassID, nil, Unknown);
          if (l_Result and $80000000) = 0 then
          begin
            l_Result := Unknown.QueryInterface(IDispatch, Ole_Handle);
            if (l_Result and $80000000) = 0 then
              Result := True;
          end;
        end;
      end;  {创建OLE对象}
      function My_CreateOleObject(const ClassName: string; out Ole_Handle: IDispatch): Boolean;
      var
        ClassID: TCLSID;
        l_Result: HResult;
      begin
        Result := False;    l_Result := CLSIDFromProgID(PWideChar(WideString(ClassName)), ClassID);
        if (l_Result and $80000000) = 0 then
        begin
          l_Result := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
            CLSCTX_LOCAL_SERVER, IDispatch, Ole_Handle);
          if (l_Result and $80000000) = 0 then
            Result := True;
        end;
      end;var
      l_Excel_Handle: IDispatch;
    begin
      if FShow_Progress = True then
      begin
        Create_Run_Excel_Form(nil);
        FRun_Excel_Form.Show;
      end;  if My_GetActiveOleObject('Excel.Application', l_Excel_Handle) = False then
        if My_CreateOleObject('Excel.Application', l_Excel_Handle) = False then
        begin
          FRun_Excel_Form.Free;
          FRun_Excel_Form := nil;      raise exception.Create('启动Excel失败,可能没有安装Excel!');
          Result := False;
          Exit;
        end;
      FExcel_Handle := l_Excel_Handle;  if FShow_Progress = True then
      begin
        FRun_Excel_Form.Free;
        FRun_Excel_Form := nil;
      end;
      Result := True;
    end;{插入新的工作博}
    function TDBGridEhExport.New_Workbook: Boolean;
    var
      i: Integer;
    begin
      Result := True;
      try
        FWorkbook_Handle := FExcel_Handle.Workbooks.Add;
      except
        raise exception.Create('新建Excel工作表出错!');
        Result := False;
        Exit;
      end;  if FTitle <> '' then
        FWorkbook_Handle.Application.ActiveWindow.Caption := FTitle;
      if FSheetName <> '' then
      begin
        for i := 2 to FWorkbook_Handle.Sheets.Count do
          if FSheetName = FWorkbook_Handle.Sheets[i].Name then
          begin
            raise exception.Create('工作表命名重复!');
            Result := False;
            exit;
          end;
        try
          FWorkbook_Handle.Sheets[1].Name := FSheetName;
        except
          raise exception.Create('工作表命名错误!');
          Result := False;
          exit;
        end;
      end;
    end;{插入数据}
    function TDBGridEhExport.InsertData_To_Excel: Boolean;
    var
      i, j, k: Integer;
      data_Str: string;
      Column_name: string;
      Data_Set: TDataSet;  book: pointer;
      Before_Scroll, Afrer_Scroll: TDataSetNotifyEvent;
    begin
      try
        {显示插入进度}
        if FShow_Progress = True then
        begin
          Create_ProgressForm(nil);
          FProgress_Form.Show;
        end;    {第一行,插入标题}{仅仅插入可见数据}
        j := 1;
        for i := 1 to FDB_Grid.Columns.Count do
          if FDB_Grid.Columns[i - 1].Visible = True then
          begin
            FWorkbook_Handle.WorkSheets[1].Cells[1, j].Value := FDB_Grid.Columns[i - 1].Title.Caption;
            FWorkbook_Handle.WorkSheets[1].Columns[j].ColumnWidth := FDB_Grid.Columns[i - 1].Width div 6;
            j := j + 1
          end;   {插入DBGrid中的数据}
        Data_Set := FDB_Grid.DataSource.DataSet;
       {记忆当前位置并取消任何事件}
    //  new(book);
        book := Data_Set.GetBook;    Data_Set.DisableControls;
        Before_Scroll := Data_Set.BeforeScroll;
        Afrer_Scroll := Data_Set.AfterScroll;
        Data_Set.BeforeScroll := nil;
        Data_Set.AfterScroll := nil;    if FShow_Progress = True then
        begin
          Data_Set.Last;
          FProgress_Form.Refresh;
          FProgressBar.Max := Data_Set.RecordCount;
        end;    Data_Set.First;    k := 2;
        while not Data_Set.Eof do
        begin
          if FShow_Progress = True then
            FProgressBar.Position := k;      j := 1;
          for i := 1 to FDB_Grid.Columns.Count do
          begin
            if FDB_Grid.Columns[i - 1].Visible = True then
            begin
              Column_name := FDB_Grid.Columns[i - 1].FieldName;
              data_Str := FDB_Grid.Fields[i - 1].DisplayText;
              FWorkbook_Handle.WorkSheets[1].Cells[k, j].Value := data_Str;
              j := j + 1;
            end;
          end;
          k := k + 1;
          Data_Set.Next;
        end;    {恢复原始事件以及标志位置}
        Data_Set.GotoBook(book);
        Data_Set.FreeBook(book);
    //  dispose(book);
        Data_Set.EnableControls;
        Data_Set.BeforeScroll := Before_Scroll;
        Data_Set.AfterScroll := Afrer_Scroll;    Result := True;
      finally
        FExcel_Handle.Visible := True;
        FExcel_Handle.Application.ScreenUpdating := True;    if FShow_Progress = True then
        begin
          FProgress_Form.Free;
          FProgress_Form := nil;
        end;
      end;
    end;
      

  8.   

    太繁琐了
    ehlib2.3本身就带有转换成各种格式文件的功能!
    聪明的程序员用DELPHI!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  9.   

    第四部分:{===============================================================================}
    {启动Excel时给出进度显示}
    procedure TDBGridEhExport.Create_Run_Excel_Form(AOwner: TComponent);
    var
      Panel: TPanel;
      Prompt: TLabel;                                           {提示的标签}
    begin
      if assigned(FRun_Excel_Form) then exit;  FRun_Excel_Form := TForm.Create(AOwner);
      with FRun_Excel_Form do
      begin
        try
          Font.Name := '宋体';                                  {设置字体}
          Font.Size := 9;
          BorderStyle := bsNone;
          Width := 300;
          Height := 100;
          BorderWidth := 2;
          Color := clBlue;
          Position := poScreenCenter;      Panel := TPanel.Create(FRun_Excel_Form);
          with Panel do
          begin
            Parent := FRun_Excel_Form;
            Align := alClient;
            BevelInner := bvNone;
            BevelOuter := bvRaised;
            Caption := '';
          end;      Prompt := TLabel.Create(Panel);
          with Prompt do
          begin
            Parent := panel;
            AutoSize := True;
            Left := 25;
            Top := 25;
            Caption := '正在导出数据,请稍候……';
          end;
        except
        end;
      end;
    end;
    {===============================================================================}
    {创建进度显示窗口}
    procedure TDBGridEhExport.Create_ProgressForm(AOwner: TComponent);
    var
      Panel: TPanel;
      Prompt: TLabel;                                           {提示的标签}
    begin
      if assigned(FProgress_Form) then exit;  FProgress_Form := TForm.Create(AOwner);
      with FProgress_Form do
      begin
        try
          Font.Name := '宋体';                                  {设置字体}
          Font.Size := 9;
          BorderStyle := bsNone;
          Width := 300;
          Height := 100;
          BorderWidth := 2;
          Color := clBlue;
          Position := poScreenCenter;
          Panel := TPanel.Create(FProgress_Form);
          with Panel do
          begin
            Parent := FProgress_Form;
            Align := alClient;
            BevelInner := bvNone;
            BevelOuter := bvRaised;
            Caption := '';
          end;      Prompt := TLabel.Create(Panel);
          with Prompt do
          begin
            Parent := panel;
            AutoSize := True;
            Left := 25;
            Top := 25;
            Caption := '正在导出数据,请稍候……';
          end;      FProgressBar := TProgressBar.Create(panel);
          with FProgressBar do
          begin
            Parent := panel;
            Left := 20;
            Top := 50;
            Height := 18;
            Width := 260;
          end;
        except
        end;
      end;
    end;
    end.把这个unit 添加到ehlib控件包中,重新编译,安装后就可在fdoth下找到dbgridehexport控件了.
      

  10.   

    to 404:
      你有ehlib2.3的控件吗?可否发给我,我下载了ehlib2.2和ehlib2.3,都无法解压缩,所以才自己写了控件,不过非常好用.ehlib2.1版本的打印好像有些不尽人意!
      

  11.   

    procedure TfrmShow.bSaveClick(Sender: TObject);
    var ExpClass:TDBGridEhExportClass;
        Ext:String;
    begin
      SaveDialog1.FileName := 'file1';
      if (ActiveControl is TDBGridEh) then
        if SaveDialog1.Execute then
        begin
          case SaveDialog1.FilterIndex of
            1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
            2: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
            3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
            4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
            5: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
          else
            ExpClass := nil; Ext := '';
          end;
          if ExpClass <> nil then
          begin
            if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
               UpperCase(Ext) then
              SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
            SaveDBGridEhToExportFile(ExpClass,DBGridEh1,
                 SaveDialog1.FileName,true);
          end;
        end;end;