Forum > Portuguese

Ler planilha de cálculo

(1/2) > >>

nightrider:
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:
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:
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:

--- Quote from: nightrider on December 27, 2011, 12:27:44 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?

--- End quote ---

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:
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?


[ ]

Navigation

[0] Message Index

[#] Next page

Go to full version