请教大家关于DBGridToExcel控件的使用方法??????????????????????????

时间:2022-04-22 21:24:25
今天在网上下载了一个DBGridToExcel控件,目的是想要把DBGrid中的记录直接导入到Excel的表格中,我在程序中试了一下,点击我的按钮过后,进度条飞快的闪过,不知道成功没有,我在程序的工程目录下找了一下,也没有找到保存的excel表格,不知道存成功没有,怎样才能指定要保存的路径???????

我写的是
procedure TForm1.Button1Click(Sender: TObject);
begin
DBGridToExcel1.ShowProgress:=true;
DBGridToExcel1.ExportToExcel;
end;

请大家指点我一下!!!!!!!!!!!!!!!!!!!!!!!

3 个解决方案

#1


DBGridToExcel1.ExportToExcel(DBGrid);

#2


我在属性里面是设置了的啊,我看那个状态应该是导入成功了的,但是不知道保存在什么位置???????????????


我还是附上我下载的DBGridToExcel的源码吧,大家帮我研究研究???


unit DBGridToExcel;


interface

uses
  Windows, StdCtrls, ComCtrls, Messages, DBGrids, Graphics, ExtCtrls,
  Forms, DB, ComObj, Controls, SysUtils, Classes;

ResourceString
  SPromptExport     = '请等待,正在导出数据……';
  SConnectExcel     = '正在启动Excel,请稍候……';
  SConnectExcelError= '连接Excel失败,可能没有安装Excel,无法导出.';
  SCancel           = '取消(&C)';
  SError            = '错误';
  SConfirm          = '真的要终止数据的导出吗?';
  SCaption          = '确认';
  SGridError        = '没有指定数据集,请指定数据集控件!';

type
  TDBGridToExcel = class(TComponent)
  private
    ProgressForm: TForm;
    FShowProgress: Boolean;
    ExcelApp : Variant;
    FTitle: String;
    Quit: Boolean;
    FOnProgress: TNotifyEvent;
    FGrid: TDBGrid;   {The Source Grid}
    ProgressBar: TProgressBar;
    Prompt: TLabel;
    FAutoExit: Boolean;
    FAutoSize: Boolean;
    FDBGrid: TDBGrid;
    procedure SetShowProgress(const Value: Boolean);
    procedure CreateProgressForm;
    procedure ButtonClick(Sender: TObject);
    Function ConnectToExcel: Boolean;
    procedure ExportDBGrid;
    { Private declarations }
  protected
    { Protected declarations }
  public
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy(); override;
    Procedure ExportToExcel;   {Export Grid To Excel}
    { Public declarations }
  published
    { Published declarations }
    property DBGrid: TDBGrid read FDBGrid write FDBGrid;
    property Title: String read FTitle write FTitle;
    property ShowProgress: Boolean read FShowProgress write SetShowProgress;

    property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TDBGridToExcel]);
end;

{ TDBGridToExcel }

procedure TDBGridToExcel.ButtonClick(Sender: TObject);
begin
  Quit := MessageBox(ProgressForm.Handle, pchar(SConfirm), pchar(SCaption),
    MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
end;

function TDBGridToExcel.ConnectToExcel: Boolean;
begin
  Result := true;
  Try
    ExcelApp := CreateOleObject('Excel.Application');
    ExcelApp.Visible := False;
    if Title<>'' then ExcelApp.Caption := Title;
    ExcelApp.WorkBooks.Add;
  except
    MessageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
    result := false;
  end;
end;

constructor TDBGridToExcel.Create(AOwner: TComponent);
begin
  inherited;
  FShowProgress := True;          {Default value was Show the Progress}
  FAutoExit := False;
  FAutoSize := True;
end;

procedure TDBGridToExcel.CreateProgressForm;
var
  Panel  : TPanel;
  Button : TButton;
begin
  if Assigned(ProgressForm) then exit;  {Aready Create?}

  ProgressForm := TForm.Create(Owner);
  With ProgressForm do
  begin
    Font.Name := '宋体';
    Font.Size := 10;
    BorderStyle := bsNone;
    Width := 280;
    Height := 120;
    BorderWidth := 1;
    Color := clBackground;
    Position := poOwnerFormCenter;
  end;

  Panel := TPanel.Create(ProgressForm);
  with Panel do { Create Panel }
  begin
    Parent := ProgressForm;
    Align := alClient;
    BevelInner := bvNone;
    BevelOuter := bvRaised;
    Caption := '';
  end;

  Prompt := TLabel.Create(Panel);
  with Prompt do { Create Label }
  begin
    Parent := Panel;
    Left := 20;
    Top := 25;
    Caption := SConnectExcel;
  end;

  ProgressBar := TProgressBar.Create(panel);
  with ProgressBar do { Create ProgressBar }
  begin
    Step := 1;
    Parent := Panel;
    Smooth := true;
    Left := 20;
    Top := 50;
    Height := 18;
    Width := 260;
  end;

  Button := TButton.Create(Panel);
  with Button do { Create Cancel Button }
  begin
    Parent := Panel;
    Left := 115;
    Top := 80;
    Caption := SCancel;
    OnClick := ButtonClick;
  end;

  ProgressForm.Show;
  ProgressForm.Update;
end;

destructor TDBGridToExcel.Destroy;
begin

  inherited;
end;

procedure TDBGridToExcel.ExportDBGrid;
var
  Data   : TDataSet;
  ADBGrid: TDBGrid;
  i, j   : integer;
  CurrentPoint : Pointer;
  OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
begin
  Screen.Cursor := crHourGlass;
  try
    try
      TForm(Owner).Enabled := False;
      ExcelApp.DisplayAlerts := false;
      ExcelApp.ScreenUpdating := false;
      Quit := false;

      if ShowProgress then Prompt.Caption := SPromptExport;
      ADBGrid := DBGrid;
      Data := ADBGrid.DataSource.DataSet;
      with ADBGrid do { Insert Table Header }
        for i := 1 to Columns.Count do
          if Columns[i - 1].Visible then
            ExcelApp.Cells[1,i].Value :=Columns[i - 1].Title.Caption;

      CurrentPoint := Data.GetBookmark;  {Save Current Position}
      OldBeforeScroll := Data.BeforeScroll; { Save Old Before Scroll Event handle }
      OldAfterScroll := Data.AfterScroll; { Save Old After Scroll Event Handle }
      Data.DisableControls; { Disable Control }
      Data.BeforeScroll := nil;
      Data.AfterScroll := nil;
  
      if ShowProgress then ProgressBar.Max := Data.RecordCount;
      i := 2;
      Data.First;
      while not Data.Eof do  { Process All record }
      begin
        with ADBGrid do { Process one record }
          for j := 1 to Columns.Count do
            if Columns[j - 1].Visible then
              ExcelApp.Cells[i,j].Value := Columns[j - 1].Field.DisplayText;
        Inc(i);
        Data.Next;
        if Assigned(FOnProgress) then FOnProgress(Self);
        if ShowProgress then { Update Progress UI }
        begin
          ProgressBar.StepIt;
          Application.ProcessMessages;
          if Quit then exit;
        end;
      end;
    except
      MessageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
    end;
    ExcelApp.Visible := False;
    TForm(Owner).Enabled := True;
    Screen.Cursor := crDefault;
    if ShowProgress then FreeAndNil(ProgressForm); { Free Progress Form }
    ExcelApp.DisplayAlerts := True;
    ExcelApp.ScreenUpdating := True;
  finally
    Data.BeforeScroll := OldBeforeScroll; { Restore Old Event Handle }
    Data.AfterScroll := OldAfterScroll;
    Data.GotoBookmark(CurrentPoint);
    Data.FreeBookmark(CurrentPoint);
    Data.EnableControls;
    Screen.Cursor := crDefault;
  end;
end;

procedure TDBGridToExcel.ExportToExcel;
begin
  if DBGrid= nil then raise Exception.Create(SGridError); {No DataSource, then Error}
  if ShowProgress then CreateProgressForm; {Whether or not Show the ProgressForm}
  if not ConnectToExcel then { Exit when error occer }
  begin
    if ShowProgress then  FreeAndNil(ProgressForm);   {release form}
    exit;
  end;
  ExportDBGrid;  {begin Export Data}
end;

procedure TDBGridToExcel.SetShowProgress(const Value: Boolean);
begin
  FShowProgress := Value;
end;
end.

#3


请高手帮我解决一下!!!!!!!!!!!!!!!!!!!

#1


DBGridToExcel1.ExportToExcel(DBGrid);

#2


我在属性里面是设置了的啊,我看那个状态应该是导入成功了的,但是不知道保存在什么位置???????????????


我还是附上我下载的DBGridToExcel的源码吧,大家帮我研究研究???


unit DBGridToExcel;


interface

uses
  Windows, StdCtrls, ComCtrls, Messages, DBGrids, Graphics, ExtCtrls,
  Forms, DB, ComObj, Controls, SysUtils, Classes;

ResourceString
  SPromptExport     = '请等待,正在导出数据……';
  SConnectExcel     = '正在启动Excel,请稍候……';
  SConnectExcelError= '连接Excel失败,可能没有安装Excel,无法导出.';
  SCancel           = '取消(&C)';
  SError            = '错误';
  SConfirm          = '真的要终止数据的导出吗?';
  SCaption          = '确认';
  SGridError        = '没有指定数据集,请指定数据集控件!';

type
  TDBGridToExcel = class(TComponent)
  private
    ProgressForm: TForm;
    FShowProgress: Boolean;
    ExcelApp : Variant;
    FTitle: String;
    Quit: Boolean;
    FOnProgress: TNotifyEvent;
    FGrid: TDBGrid;   {The Source Grid}
    ProgressBar: TProgressBar;
    Prompt: TLabel;
    FAutoExit: Boolean;
    FAutoSize: Boolean;
    FDBGrid: TDBGrid;
    procedure SetShowProgress(const Value: Boolean);
    procedure CreateProgressForm;
    procedure ButtonClick(Sender: TObject);
    Function ConnectToExcel: Boolean;
    procedure ExportDBGrid;
    { Private declarations }
  protected
    { Protected declarations }
  public
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy(); override;
    Procedure ExportToExcel;   {Export Grid To Excel}
    { Public declarations }
  published
    { Published declarations }
    property DBGrid: TDBGrid read FDBGrid write FDBGrid;
    property Title: String read FTitle write FTitle;
    property ShowProgress: Boolean read FShowProgress write SetShowProgress;

    property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TDBGridToExcel]);
end;

{ TDBGridToExcel }

procedure TDBGridToExcel.ButtonClick(Sender: TObject);
begin
  Quit := MessageBox(ProgressForm.Handle, pchar(SConfirm), pchar(SCaption),
    MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
end;

function TDBGridToExcel.ConnectToExcel: Boolean;
begin
  Result := true;
  Try
    ExcelApp := CreateOleObject('Excel.Application');
    ExcelApp.Visible := False;
    if Title<>'' then ExcelApp.Caption := Title;
    ExcelApp.WorkBooks.Add;
  except
    MessageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
    result := false;
  end;
end;

constructor TDBGridToExcel.Create(AOwner: TComponent);
begin
  inherited;
  FShowProgress := True;          {Default value was Show the Progress}
  FAutoExit := False;
  FAutoSize := True;
end;

procedure TDBGridToExcel.CreateProgressForm;
var
  Panel  : TPanel;
  Button : TButton;
begin
  if Assigned(ProgressForm) then exit;  {Aready Create?}

  ProgressForm := TForm.Create(Owner);
  With ProgressForm do
  begin
    Font.Name := '宋体';
    Font.Size := 10;
    BorderStyle := bsNone;
    Width := 280;
    Height := 120;
    BorderWidth := 1;
    Color := clBackground;
    Position := poOwnerFormCenter;
  end;

  Panel := TPanel.Create(ProgressForm);
  with Panel do { Create Panel }
  begin
    Parent := ProgressForm;
    Align := alClient;
    BevelInner := bvNone;
    BevelOuter := bvRaised;
    Caption := '';
  end;

  Prompt := TLabel.Create(Panel);
  with Prompt do { Create Label }
  begin
    Parent := Panel;
    Left := 20;
    Top := 25;
    Caption := SConnectExcel;
  end;

  ProgressBar := TProgressBar.Create(panel);
  with ProgressBar do { Create ProgressBar }
  begin
    Step := 1;
    Parent := Panel;
    Smooth := true;
    Left := 20;
    Top := 50;
    Height := 18;
    Width := 260;
  end;

  Button := TButton.Create(Panel);
  with Button do { Create Cancel Button }
  begin
    Parent := Panel;
    Left := 115;
    Top := 80;
    Caption := SCancel;
    OnClick := ButtonClick;
  end;

  ProgressForm.Show;
  ProgressForm.Update;
end;

destructor TDBGridToExcel.Destroy;
begin

  inherited;
end;

procedure TDBGridToExcel.ExportDBGrid;
var
  Data   : TDataSet;
  ADBGrid: TDBGrid;
  i, j   : integer;
  CurrentPoint : Pointer;
  OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
begin
  Screen.Cursor := crHourGlass;
  try
    try
      TForm(Owner).Enabled := False;
      ExcelApp.DisplayAlerts := false;
      ExcelApp.ScreenUpdating := false;
      Quit := false;

      if ShowProgress then Prompt.Caption := SPromptExport;
      ADBGrid := DBGrid;
      Data := ADBGrid.DataSource.DataSet;
      with ADBGrid do { Insert Table Header }
        for i := 1 to Columns.Count do
          if Columns[i - 1].Visible then
            ExcelApp.Cells[1,i].Value :=Columns[i - 1].Title.Caption;

      CurrentPoint := Data.GetBookmark;  {Save Current Position}
      OldBeforeScroll := Data.BeforeScroll; { Save Old Before Scroll Event handle }
      OldAfterScroll := Data.AfterScroll; { Save Old After Scroll Event Handle }
      Data.DisableControls; { Disable Control }
      Data.BeforeScroll := nil;
      Data.AfterScroll := nil;
  
      if ShowProgress then ProgressBar.Max := Data.RecordCount;
      i := 2;
      Data.First;
      while not Data.Eof do  { Process All record }
      begin
        with ADBGrid do { Process one record }
          for j := 1 to Columns.Count do
            if Columns[j - 1].Visible then
              ExcelApp.Cells[i,j].Value := Columns[j - 1].Field.DisplayText;
        Inc(i);
        Data.Next;
        if Assigned(FOnProgress) then FOnProgress(Self);
        if ShowProgress then { Update Progress UI }
        begin
          ProgressBar.StepIt;
          Application.ProcessMessages;
          if Quit then exit;
        end;
      end;
    except
      MessageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
    end;
    ExcelApp.Visible := False;
    TForm(Owner).Enabled := True;
    Screen.Cursor := crDefault;
    if ShowProgress then FreeAndNil(ProgressForm); { Free Progress Form }
    ExcelApp.DisplayAlerts := True;
    ExcelApp.ScreenUpdating := True;
  finally
    Data.BeforeScroll := OldBeforeScroll; { Restore Old Event Handle }
    Data.AfterScroll := OldAfterScroll;
    Data.GotoBookmark(CurrentPoint);
    Data.FreeBookmark(CurrentPoint);
    Data.EnableControls;
    Screen.Cursor := crDefault;
  end;
end;

procedure TDBGridToExcel.ExportToExcel;
begin
  if DBGrid= nil then raise Exception.Create(SGridError); {No DataSource, then Error}
  if ShowProgress then CreateProgressForm; {Whether or not Show the ProgressForm}
  if not ConnectToExcel then { Exit when error occer }
  begin
    if ShowProgress then  FreeAndNil(ProgressForm);   {release form}
    exit;
  end;
  ExportDBGrid;  {begin Export Data}
end;

procedure TDBGridToExcel.SetShowProgress(const Value: Boolean);
begin
  FShowProgress := Value;
end;
end.

#3


请高手帮我解决一下!!!!!!!!!!!!!!!!!!!