Recent

Author Topic: Ler planilha de cálculo  (Read 5782 times)

nightrider

  • Full Member
  • ***
  • Posts: 139
Ler planilha de cálculo
« on: December 26, 2011, 01:38:37 pm »
Fiz 1 programa teste para tentar abrir e ler uma plnilha de calculo e recebi os erros como mostrado nos anexos. Eu juro que tentei de muitas maneiras fazer funcionar, mas nao consegui. Se há um exemplo pronto em algum lugar nao fui capaz de achar.

O código é:

unit untTesteLePlanExcel;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  fpspreadsheet;

type

  { TForm1 }

  TForm1 = class(TForm)
    btnTeste: TButton;
    btnSair: TButton;
    procedure btnSairClick(Sender: TObject);
    procedure btnTesteClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    MyWorkbook: TsWorkbook;
    MyWorksheet: TsWorksheet;
  public
    { public declarations }
  end;

var
  Form1: TForm1;
const aaa : TsSpreadsheetFormat = sfExcel8;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnSairClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.btnTesteClick(Sender: TObject);
begin
  MyWorkbook.ReadFromFile('C:\testeslazarus\TesteLeituraPlanExcel\planteste.xls');
  MyWorksheet := MyWorkbook.GetFirstWorksheet;
  ShowMessage(IntToStr(MyWorksheet.GetLastRowNumber));
  ShowMessage(IntToStr(MyWorksheet.GetLastColNumber));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyWorkbook := TsWorkbook.Create;
  MyWorksheet := TsWorksheet.Create;
end;

end.

felipemdc

  • Administrator
  • Hero Member
  • *
  • Posts: 3538
Re: Ler planilha de cálculo
« Reply #1 on: December 26, 2011, 10:06:16 pm »
Você tem que adicionar no uses clause os formatos que quer suportar no caso adicione: xlsbiff8

Outra dica:

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyWorkbook := TsWorkbook.Create;
  MyWorksheet := TsWorksheet.Create;
end;

Pode deletar a linha MyWorksheet := TsWorksheet.Create;

O exemplo fica aqui:

http://wiki.lazarus.freepascal.org/FPSpreadsheet

nightrider

  • Full Member
  • ***
  • Posts: 139
Re: Ler planilha de cálculo
« Reply #2 on: December 27, 2011, 12:27:44 am »
Legal Felipe. Funcionou, como sempre acontece quando tu me das as dicas.

Só fiquei com uma duvida. Quem instancia a classe MyWorkSheet já que removi o Create?

Estaria o instanciamento implicito ao chamar o método GetFirstWorksheet?

[ ]

Ricardo

felipemdc

  • Administrator
  • Hero Member
  • *
  • Posts: 3538
Re: Ler planilha de cálculo
« Reply #3 on: December 27, 2011, 12:45:49 am »
Só fiquei com uma duvida. Quem instancia a classe MyWorkSheet já que removi o Create?

Estaria o instanciamento implicito ao chamar o método GetFirstWorksheet?

Não, o instanciamento ocorre em: MyWorkbook.ReadFromFile('C:\testeslazarus\TesteLeituraPlanExcel\planteste.xls');

Somente se houver pelo menos 1 folha na planílha.

Ao fazer esta chamada:

MyWorksheet := MyWorkbook.GetFirstWorksheet;

Você obtem uma referencia para o primeiro Worksheet. Mas não criou uma nova instancia, só pegou a instancia que estava já criada e já armazenada internamente pelo MyWorkbook. Essa rotina pode retornar nil, então o seu código falta verificar essa possibilidade, mas é muito raro uma planílha sem nenhuma folha e daí seria o caso de levantar uma exceção mesmo.

Se fosse criada uma nova instancia daí você ia ter que dar Free nela, mas não é o caso.

Falando nisso no seu código falta MyWorkbook.Free; no FormDestroy.

nightrider

  • Full Member
  • ***
  • Posts: 139
Re: Ler planilha de cálculo
« Reply #4 on: December 27, 2011, 12:19:47 pm »
Aproveitando o gancho: Preciso chamar o Free mesmo que minha aplicação vá terminar em seguida? Sempre tive impressão que ao encerrar 1 programa todos os objetos eram liberados automaticamente.

Pensei errado?


[ ]

felipemdc

  • Administrator
  • Hero Member
  • *
  • Posts: 3538
Re: Ler planilha de cálculo
« Reply #5 on: December 27, 2011, 01:26:25 pm »
Aproveitando o gancho: Preciso chamar o Free mesmo que minha aplicação vá terminar em seguida? Sempre tive impressão que ao encerrar 1 programa todos os objetos eram liberados automaticamente.

O sistema operacional libera todos objetos alocados quando o programa termina. É só uma questão de boa pratica dar o Free assim mesmo. Acho que o único efeito prático é ajudar se você precisar usar um software que detecta memleaks, pois isso ia aparecer na lista de memleaks.

 

TinyPortal © 2005-2018