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

Bu blogdaki popüler yayınlar

VBA - Mscomm (seri port) ile veri loglama

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

Lazarus free pascal - Tanıtım