Friday, 22 May 2009

Copy-paste de un Excel a un TStringGrid

Hace días que intento encontrar una forma de copiar del clipboard el contenido de un excel hacia un TStringGrid, y ahora que lo tengo, aquí os muestro como hacerlo, es bastante sencillo, y solo hay que parsear el contenido del clipboard e ir ubicando cada celda en su correspondiente sitio. El ejemplo que os pongo es bastante sencillo, y permite dar una visión más grande de lo que se puede llegar a hacer, en mi caso estaba harto de tratar con TMemo, porque requería de uno más por cada columna que necesitaba, y en este caso con el componente TStringGrid, puedo personalizar las columnas a mi antojo.


En este caso lo que haré, es crear una clase personalizada de TStringGrid -> TCustomGrid, donde incluiré un par de propiedades públicas que me ayuden a parsear el contenido del clipboard. Aquí os dejo el código fuente:




uses
Clipbrd;

type
TTest = class(TForm)
sgTest: TStringGrid;
procedure sgTestKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TCustomGrid = class(TStringGrid)
const
cRETURN1 = #13;
cRETURN2 = #10;
cTAB = #9;
public
iCol: integer;
iRow: integer;
procedure LoadParam();
procedure ClearCells();
procedure AddValue(Value: string);
end;


procedure TTest.sgTestKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
Value: string;
Str: string;
i: Integer;
Custom: TCustomGrid;
begin
if (Shift = [ssCtrl]) and (Key = 67) then //CONTROL+C (Copiar)
begin
Str := '';
for i := 1 to sgtest.ColCount - 1 do
begin
Str := Str + sgtest.Cells[i, sgtest.Row] + chr(9);
end;
Str := Copy(Str, 1, Length(Str) - 1);
Clipboard.Open;
Clipboard.AsText := Str;
Clipboard.Close;
end
else if (Shift = [ssCtrl]) and (Key = 86) then //CONTROL+V (Pegar)
begin
Clipboard.Open;
if not Clipboard.HasFormat(CF_Text) then
Exit;
Value := Clipboard.AsText;
Clipboard.Close;
Custom := TCustomGrid(sgtest);
Custom.LoadParam;
Custom.ClearCells;
for i := 1 to Length(Value) do
begin
if Copy(Value, i, 1) = Custom.cRETURN1 then
Continue;
if Copy(Value, i, 1) = Custom.cRETURN2 then
begin
Custom.iCol := Custom.Col;
Inc(Custom.iRow);
if i < Length(Value) then
Custom.ClearCells;
Continue;
end;
if Copy(Value, i, 1) = Custom.cTAB then
begin
Inc(Custom.iCol);
if i < Length(Value) then
Custom.ClearCells;
Continue;
end;
Custom.AddValue(Copy(Value, i, 1));
end;
if Custom.RowCount - 1 < Custom.iRow then
Custom.RowCount := Custom.iRow;
if Custom.InplaceEditor = nil then
Exit;
Custom.InplaceEditor.Text := Custom.Cells[Custom.Col, Custom.Row];
Custom.InplaceEditor.SelStart := Length(Custom.Cells[Custom.Col, Custom.Row]);
end;
end;

{ TCustomGrid }

procedure TCustomGrid.AddValue(Value: string);
begin
Self.Cells[Self.iCol, Self.iRow] := Self.Cells[Self.iCol, Self.iRow] + Value;
end;

procedure TCustomGrid.ClearCells;
begin
Self.Cells[Self.iCol, Self.iRow] := '';
end;

procedure TCustomGrid.LoadParam;
begin
self.iCol := self.Col;
self.iRow := self.Row;
end;







5 comments:

  1. Excelente solución, gracias por compartirla.

    Saludos!

    ReplyDelete
  2. Hola.

    Tendras el Sourcer, no me podido realizarlos. te agradeceria mucho.

    Mu correo es llimpeo@gmail.com

    ReplyDelete
    Replies
    1. Hola Muglidark,

      El codigo es el que hay en el blog. No hay nada de especial. Solo tienes que poner el componente StringGrid en tu formulario y utilizar el codigo presente.

      Jordi

      Delete
  3. Jordi Corbilla, Gracias, su código ayudó mucho. Saludos desde la ciudad de Petrolina, en Brasil.

    ReplyDelete