张志峰的博客

水滴石川,积少成多。

导航

Delphi TXLSReadWriteII2 带的demo中 edit的例子

Posted on 2012-06-13 10:00  ╰★张志峰★╮  阅读(1186)  评论(0编辑  收藏  举报

unitMain;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Grids, Tabs, Cell2,

{$ifdef ver140}

  Variants,

{$endif}

  XLSUtils2, XLSReadWriteII2;

 

type

  TForm8 = class(TForm)

    Label1: TLabel;

    edFilename: TEdit;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    dlgOpen: TOpenDialog;

    Button4: TButton;

    Grid: TDrawGrid;

    TabSet: TTabSet;

    lblCell: TLabel;

    edCell: TEdit;

    XLS: TXLSReadWriteII2;

    procedure Button1Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure GridDrawCell(Sender: TObject; ACol, ARow: Integer;

      Rect: TRect; State: TGridDrawState);

    procedure TabSetChange(Sender: TObject; NewTab: Integer;

      var AllowChange: Boolean);

    procedure GridGetEditText(Sender: TObject; ACol, ARow: Integer;

      var Value: String);

    procedure GridSelectCell(Sender: TObject; ACol, ARow: Integer;

      var CanSelect: Boolean);

    procedure GridSetEditText(Sender: TObject; ACol, ARow: Integer;

      const Value: String);

    procedure GridKeyDown(Sender: TObject; var Key: Word;

      Shift: TShiftState);

    procedure FormCreate(Sender: TObject);

    procedure Button3Click(Sender: TObject);

  private

    EditCol,EditRow: integer;

    EditText: string;

 

    function ColToText(Col: integer): string;

    procedure SetCellValue(Col,Row: integer);

  public

    { Public declarations }

  end;

 

var

  Form8: TForm8;

 

implementation

 

{$R *.dfm}

 

function TForm8.ColToText(Col: integer): string;

var

  S: string;

begin

  if (Col div 26) > 0 then

    S := Char(Ord('A') + (Col div 26) - 1)

  else

    S := '';

  Result := S + Char(Ord('A') + (Col mod 26));

end;

 

procedure TForm8.Button1Click(Sender: TObject);

begin

  dlgOpen.FileName := edFilename.Text;

  if dlgOpen.Execute then

    edFilename.Text := dlgOpen.FileName;

end;

 

procedure TForm8.Button4Click(Sender: TObject);

begin

  Close;

end;

 

procedure TForm8.Button2Click(Sender: TObject);

var

  i: integer;

begin

  XLS.Sheet[0].PrintSettings.FitWidth := 2;

  XLS.Filename := edFilename.Text;

  XLS.Read;

  TabSet.Tabs.Clear;

  for i := 0 to XLS.Sheets.Count - 1 do

    TabSet.Tabs.Add(XLS.Sheets[i].Name);

  TabSet.TabIndex := 0;

  Grid.Invalidate;

end;

 

procedure TForm8.GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

var

  S: string;

begin

  if (ACol > 0) and (ARow > 0) then begin

    S := XLS.Sheets[TabSet.TabIndex].AsFmtString[ACol - 1,ARow - 1];

    if S <> '' then

      Grid.Canvas.TextRect(Rect,Rect.Left + 2,Rect.Top + 2,S);

  end

  else if (ACol <> 0) then begin

    S := ColToText(ACol - 1);

    Grid.Canvas.TextRect(Rect,Rect.Left + (Rect.Right - Rect.Left) div 2 - (Grid.Canvas.TextWidth(S) div 2),Rect.Top + 2,S);

  end

  else if (ARow <> 0) then

    Grid.Canvas.TextRect(Rect,Rect.Left + 2,Rect.Top + 2,IntToStr(ARow));

end;

 

procedure TForm8.TabSetChange(Sender: TObject; NewTab: Integer;

  var AllowChange: Boolean);

begin

  Grid.Invalidate;

end;

 

procedure TForm8.GridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String);

begin

  EditCol := ACol;

  EditRow := ARow;

  case XLS.Sheets[TabSet.TabIndex].CellType[ACol - 1,ARow - 1] of

    ctNumberFormula,

    ctStringFormula,

    ctBooleanFormula:

      Value := '=' + XLS.Sheets[TabSet.TabIndex].AsFormula[ACol - 1,ARow - 1];

    ctInteger,ctFloat:

      Value := FloatToStr(XLS.Sheets[TabSet.TabIndex].AsFloat[ACol - 1,ARow - 1]);

    else

      Value := XLS.Sheets[TabSet.TabIndex].AsWideString[ACol - 1,ARow - 1];

  end;

end;

 

procedure TForm8.GridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String);

begin

  EditText := Trim(Value);

end;

 

procedure TForm8.SetCellValue(Col,Row: integer);

begin

  if Copy(EditText,1,1) = '=' then

    XLS.Sheets[TabSet.TabIndex].AsFormula[Col,Row] := Copy(EditText,2,MAXINT)

  else begin

    try

      XLS.Sheets[TabSet.TabIndex].AsFloat[Col,Row] := StrToFloat(EditText);

    except

      XLS.Sheets[TabSet.TabIndex].AsWideString[Col,Row] := EditText;

    end;

  end;

end;

 

procedure TForm8.GridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);

begin

  lblCell.Caption := ColRowToRefStr(ACol - 1,ARow - 1,False,False);

  case XLS.Sheets[TabSet.TabIndex].CellType[ACol - 1,ARow - 1] of

    ctNumberFormula,

    ctStringFormula,

    ctBooleanFormula:

      edCell.Text := '=' + XLS.Sheets[TabSet.TabIndex].AsFormula[ACol - 1,ARow - 1];

    else

      edCell.Text := XLS.Sheets[TabSet.TabIndex].AsWideString[ACol - 1,ARow - 1];

  end;

  if (EditCol = Grid.Col) and (EditRow = Grid.Row) then

    SetCellValue(Grid.Col - 1,Grid.Row - 1);

end;

 

procedure TForm8.GridKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

  if (Key = VK_RETURN) and (EditCol = Grid.Col) and (EditRow = Grid.Row) then

    SetCellValue(Grid.Col - 1,Grid.Row - 1);

end;

 

procedure TForm8.FormCreate(Sender: TObject);

begin

  Grid.ColWidths[0] := 30;

end;

 

procedure TForm8.Button3Click(Sender: TObject);

begin

  XLS.Filename := edFilename.Text;

  XLS.Write;

end;

 

end.