Lazarus free pascal - Excel
Lazarus ile Excel dosyası okunup, yazılabiliyor veya değiştirilebiliyor. Bunun için de bilgisayarda excel'in kurulmuş olması gerekmiyor. Yani adamlar oturup uğraşmış yapmış excel kütüphanesini. Kütüphane (paket) ismi FPSpreadsheet olarak geçiyor.
2 yıl önce "VBA ile veri loglama" isimli yazımda excel içinde bulunan visual basic kodlama ile bir uygulamayı göstermiştim. Seri porttan alınan bilgi, anında excel sayfasına yazdırılıyordu. Bunun için excel versiyonunun 32-bit olması gerekiyor. Bu yazıda, aynı işin Lazarus ile de yapılabildiğini göstermek istiyorum. Dediğim gibi bilgisayarda excel kurulmuş olması gerekmiyor.
Önceki yazıları okuduysan, online paket yöneticisi ile fpspreadsheet'i Lazarus'a yükleme işini yapabilirsin. Forma bir tane TsWorksheetGrid komponenti ve 2 adet buton yerleştiriyoruz. Seri port kullanmak için bir de LazSerial paketinden TLazSerial komponentini forma eklemek lazım. Seri port kullanımı için bir önceki yazıya bakabilirsin.
IDE ile ilgili yeni bir bilgi öğrendim. Bir komut yazarken 2 veya 3 harfini yazdıktan sonra Ctrl+Space tuşlarına basınca, komutun tamamının yazıldığı seçenekler çıkıyor. Birini seçip enter'a basınca komut, düzgün bir şekilde yazılmış oluyor.
2 butonu, excel (.xlsx) dosyasını diske kaydetmek ve geri yüklemek için kullandım. Normalde bu işler IDE penceresinde yukarıda (komponent paleti), Dialogs sekmesinde bulunan TOpenDialog ve TSaveDialog ile yapılıyor.
Hercules ile seri porttan bilgileri yollayınca, son yollanan bilgi 2. satıra yazılacaktır. Her bilgi geldiğinde, alt satırlar aşağı doğru kayacaktır.
Program kodları aşağıdadır..
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, LazSerial,
fpspreadsheetgrid, fpstypes, xlsxooxml;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
LazSerial1: TLazSerial;
sWorksheetGrid1: TsWorksheetGrid;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure LazSerial1RxData(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
filename : string;
begin
filename := Application.Location + 'file.xlsx';
if FileExists(filename) then
begin
sWorksheetGrid1.LoadFromSpreadsheetFile(filename, sfOOXML);
end else
begin
ShowMessage('File not exists: ' + filename);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
filename : string;
begin
filename := Application.Location + 'file.xlsx';
sWorksheetGrid1.SaveToSpreadsheetFile(filename, sfOOXML, true);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
LazSerial1.Close;
sWorksheetGrid1.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
sWorksheetGrid1.ColWidths[1] := 100;
sWorksheetGrid1.ColWidths[2] := 100;
sWorksheetGrid1.ColWidths[4] := 180;
//Başlık satırını oluşturur
sWorksheetGrid1.Cells[1,1] := 'NO';
sWorksheetGrid1.HorAlignment[1,1] := haCenter;
sWorksheetGrid1.BackgroundColors[1,1, 4,1] := RGBToColor(255, 219, 88);
sWorksheetGrid1.CellFontStyle[1,1] := [fssBold];
sWorksheetGrid1.Cells[2,1] := 'STRING';
sWorksheetGrid1.HorAlignment[2,1] := haCenter;
sWorksheetGrid1.CellFontStyle[2,1] := [fssBold];
sWorksheetGrid1.Cells[3,1] := 'DATA';
sWorksheetGrid1.HorAlignment[3,1] := haCenter;
sWorksheetGrid1.CellFontStyle[3,1] := [fssBold];
sWorksheetGrid1.Cells[4,1] := 'DATETIME';
sWorksheetGrid1.HorAlignment[4,1] := haCenter;
sWorksheetGrid1.CellFontStyle[4,1] := [fssBold];
LazSerial1.Open;
end;
procedure TForm1.LazSerial1RxData(Sender: TObject);
var
str : string;
strArray : TStringArray;
begin
str:= LazSerial1.ReadData;
strArray:= str.split(',');
//2. satırı aşağıya kaydırır
sWorksheetGrid1.InsertRow(2);
//2. satıra seri porttan gelenleri yaz
sWorksheetGrid1.Cells[1,2] := StrToInt(strArray[0]);
sWorksheetGrid1.HorAlignment[1,2] := haCenter;
sWorksheetGrid1.Cells[2,2] := strArray[1];
sWorksheetGrid1.HorAlignment[2,2] := haCenter;
sWorksheetGrid1.Cells[3,2] := StrToInt(strArray[2].Trim);
sWorksheetGrid1.HorAlignment[3,2] := haCenter;
sWorksheetGrid1.NumberFormat[4,2] := 'dd.mm.yyyy hh:nn:ss';
sWorksheetGrid1.Cells[4,2] := now;
sWorksheetGrid1.HorAlignment[4,2] := haCenter;
end;
end.
Yorumlar
Yorum Gönder