Forum > Portuguese
Ler planilha de cálculo
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