Python ile LibreOffice makrosu yazalım

1. Ders : PyUNO kütüphanesi ile makro yazalım

Giriş

LibreOffice için Python kullanarak betik yazılabiliyor.

Bu derste Python ile ofis yazılımı için ilk betiği nasıl yazabileceğimizi anlatmaya çalışıyoruz.

Kurulum

Ubuntu tabanlı dağıtımlarda aşağıdaki paketi kurmak gerekebilir.

sudo apt install libreoffice-script-provider-python

İlk ayarlar

ArcoLinux dağıtımında uno.py kütüğünü aradık.

locate uno.py

Aşağıdaki gibi çıktı verdi.

/usr/lib/libreoffice/program/uno.py
/usr/lib/python3.12/site-packages/uno.py

Sonra bu kütüğe çalıştırma izni verdik.

sudo chmod +x /usr/lib/libreoffice/program/uno.py

Bu kütüğün bulunduğu dizini aşağıdaki gösterildiği gibi ortam değişkeni olarak ekliyoruz.

Ortam değişkeni

Eğer fish kabuğu kullanıyorsanız ~/.config/fish/config.fish kütüğüne, eğer bash kullanıyorsanız ~/.bashrc kütüğüne aşağıdaki ortam değişkenini ekleyiniz.

export PYTHONPATH="$PYTHONPATH:/usr/lib/libreoffice/program/"

Ekledikten sonra bilgisayarı tekrar başlatınız.

Çalışıyor mu?

Python makrolarının çalışıp çalışmadığını sınamak için LibreOffice yazılımında Araçlar -> Makrolar -> Makroları Yönet -> Python yolunu izleyiniz.

Buradan Uygulama Makroları -> HelloWorld -> HelloWordPython’u seçerek çalıştır tuşuna basınız.

Eğer yeni bir yazı kütüğü açıldı ve içine bir şeyler yazıldı ise Python çalışıyor demektir.

Makroları nereye kaydedeceğiz?

Linux altında dizin

/home/KULLANICI/.config/libreoffice/4/user/Scripts/python

Windows için

%APPDATA%\LibreOffice\4\user\Scripts\python

macOS için

~/Library/Application Support/LibreOffice/4/user/Scripts/python/

şeklindedir.

Linux için KULLANICI yerine kendi kullanıcı isminiz gelecek.

Eğer Scripts/python dizini yoksa oluşturunuz.

Selam verme

Belirtilen dizinde selam.py ismi ile bir kütük oluşturup içine aşağıdaki bilgileri giriniz.

import uno

def selamVer():
    belge = XSCRIPTCONTEXT.getDocument()
    hücre = belge.Sheets[0]['A1']
    hücre.setString("Selâmun Aleyküm")
    return

Makroyu çalıştıralım

Makroyu çalıştırmak için Araçlar->Makrolar->Makro Çalıştır yolunu izleyiniz.

Makrolarım isimli kütüphaneden selam ve selamVeri seçip sonra da Çalıştır düğmesine basınız.

Makro çalıştığında A1 hücresine Selâmun Aleyküm yazması gerekiyor.


2. Ders : Basic dilinden Python’u çağıralım

Giriş

Bir önceki Python makro derslerine devam ediyoruz.

Bu derste Basic içinden Python’u nasıl çağırabileceğimizi öğrenmeye çalışacağız.

Python kütüğünü oluşturalım

Hatırlayabileceğiniz üzere python kütüklerin /home/KULLANICI/.config/libreoffice/4/user/Scripts/python dizininde oluşturuyorduk.

Burada tarih.py isimli bir kütük oluşturup içine aşağıdaki bilgileri girelim.

from datetime import datetime

def tarih():
    return datetime.utcnow().strftime("%-d %B %A")

g_exportedScripts = (tarih,)

Basic içinden Python’u çağıralım

Bunun için LibreOffice yazılımını açınız.

Araçlar->Makrolar->Makroları Yönet->Basic yolunu takip ediniz. Burada Makrolarım -> Standard -> Module1 seçili iken Düzenle tuşuna basınız.

Gelen düzenleyiciye aşağıdaki kodu giriniz.

REM  *****  BASIC  *****

Function Gunlerden
    hizmetSaglayici= ThisComponent.getScriptProvider()
    betik = hizmetSaglayici.getScript("vnd.sun.star.script:tarih.py$tarih?language=Python&location=user")
    Gunlerden = betik.invoke(array(), array(), array())
End Function

Dosya bölümünden Kaydet seçeneği ile makroyu kaydediniz.

Tarih işlevini sınayalım

Tekrar hesap tablosuna dönünüz.

Burada herhangi bir hücreye =GUNLERDEN() işlevini girerseniz tarihin uzun olarak yazıldığını görebilirsiniz.

Örneğin bu gün 14 Mayıs Salı yazıldı.

Kaynak :

Python dersleri

8 Beğeni

3. Ders : Renklere göre toplama yapma

Giriş

Aslında daha basit örneklerle ilerlemek düşünülebilir. Ancak bu derste azıcık ileri saracağız.

Forumlarda bir arkadaş renklere göre hücre toplamanın nasıl yapılacağını sormuştu.

Allah’ın izni ile bir çözüm geliştirdik.

Şimdi sizlere de izah etmeye çalışalım.

Renklere göre toplama

Aşağıdaki kütüğü

/home/erdem/.config/libreoffice/4/user/Scripts/python

dizinine renkli.py ismi ile kaydediniz.

Burada erdem yerine kendi kullanıcı adınızı seçiniz.

import uno

def rengeGoreTopla(renk):
    belge = XSCRIPTCONTEXT.getDocument()
    sayfa = belge.Sheets[0]
    renkliHücre = sayfa[renk]
    istediğimizRenk = renkliHücre.CellBackColor
    toplam = 0
    for satır in range(0, 19):
        for sütun in range(0, 11):
            hücre = sayfa.getCellByPosition(sütun, satır)
            if hücre.CellBackColor == istediğimizRenk:
                okunan = hücre.getValue()
                toplam += okunan
    renkliHücre.setString(str(toplam))
    return

def  renkliTopla(birşeyler):
    renkliHücreler = { "M1", "M2", "M3", "M4", "M5" }
    for hücre in renkliHücreler:
        rengeGoreTopla(hücre)

Makroyu çalıştırdığınızda M1:M5 aralığındaki hücrelerin renklerine göre A1:K19 arasında bulunan sayıları topluyor.

Renge göre hücreleri topla

Veriler değiştiğinde makronun çalışması için altaki Sayfa1 e sağ tıklayınız.

Sayfa Olayları -> İçerik değişti ata Makro yolunu takip ederek renkli içinden renkliTopla yı seçiniz.

Makroların çalışabilmesi için Araçlar -> Seçenekler -> Güvenlik -> Makro Güvenliği yolunu takip ederek Düşük ya da Orta olarak seçmek gerekiyor.

Orta düzey güvenlik seçerseniz makro içeren her belgede sizden onay istiyor.

Uygulama için oluşturduğumuz hesap tablosunu buradan indirebilirsiniz.

8 Beğeni

Bunları video olarak da hazırlayıp ders ders yapsanız güzel olurdu. :clap:

5 Beğeni

4.Ders : Makroyu kaynak kütüğe eklemek

Giriş

Bu derste Libre Office kütüklerine yakından bakıp oluşturduğumuz makroları kütüğe nasıl gömebileceğimize bakacağız.

İlk derste tek bir hücreye konum yazmıştık.

Bu derste birden çok hücreye konum bilgilerini yazmaya çalışacağız.

Libre Office kütüğüne yakından bakalım

Öncelikle dersler/konum ismi ile bir dizin oluşturalım ve bu dizinin içine girelim.

mkdir dersler
mkdir dersler/konum
cd dersler/konum/

Hesap tablosu yazılımını başlatınız.

libreoffice --calc --norestore

Açılan boş belgeyi Dosya -> Farklı Kaydet seçeneği ile oluşturduğumuz /dersler/konum/ dizininde konum ismi ile kaydediniz.

Tekrardan bu dizine gelip kütüğü genişletelim.

cd dersler/konum/
unzip konum.ods

Öncelikle eski kütüğü silelim.

rm konum.ods

Python betiklerini kaydetmek için Scripts/python isimli bir dizin oluşturmak gerekiyor.

mkdir Scripts
mkdir Scripts/python

Belgenin içine gömmek istediğimiz betikleri python dizininde oluşturacağız.

Bu dizinde konum.py kütüğü içine aşağıdaki bilgileri girelim.

import uno

def konumYaz (args=None):
    belge = XSCRIPTCONTEXT.getDocument()
    sayfa = belge.Sheets[0]
    for satır in range(15):
        for sütun in range(15):
            geçerliHücre = sayfa.getCellByPosition(sütun, satır)
            yazılacak = "(" + str(satır) + "," + str(sütun) + ")"
            geçerliHücre.setString(yazılacak)

def içeriğiSil (args=None):
    belge = XSCRIPTCONTEXT.getDocument()
    sayfa = belge.Sheets[0]
    for satır in range(15):
        for sütun in range(15):
            geçerliHücre = sayfa.getCellByPosition(sütun, satır)
            geçerliHücre.setString("")

Python kütüğünü oluşturduktan sonra META-INF dizininde bulunan manifest.xml kütüğünü açalım.

nano META-INF/manifest.xml

Sonda bulunan </manifest:manifest> bölümünden önce şu satırları ekleyelim.

<manifest:file-entry manifest:full-path="Scripts/python/konum.py" manifest:media-type="" />
<manifest:file-entry manifest:full-path="Scripts/python/" manifest:media-type="application/binary" />
<manifest:file-entry manifest:full-path="Scripts/" manifest:media-type="application/binary" />

Hesap tablosunu tekrar oluşturmak için aşağıdaki komutu veriniz.

zip -r ../konum.ods *

Böylece dersler dizininde hesap tablomuz oluştu. Tek farkla ki artık gömülü olarak bir Python betiği içeriyor.

Düğme ekleyelim

Oluşturduğumuz kütüğü hesap tablosu yazılımı ile açalım.

Eğer makro güvenliğini orta seviyeye ayarladı iseniz, kütük ilk açıldığında makroları etkinleştirmek isteyip istemediğimizi soruyor.

Burada Makroları Etkinleştir seçeneğini seçiniz.

Makroların çalışabilmesi için Araçlar -> Seçenekler -> Güvenlik -> Makro Güvenliği yolunu takip ederek Düşük ya da Orta olarak seçmek gerekiyor.

Görünüm -> Araç Çubukları -> Form Denetimleri yolunu takip ederek form denetimlerini açınız.

Gelen pencerede fare simgesinin dört sıra altında bulunan itme düğmesine tıklayınız.

Fare basılı iken bir alan seçiniz. Böylece düğmeyi hesap tablosuna ekledi.

Düğmeyi sağ tıklayıp denetim özelliklerini seçiyoruz.

Burada Genel bölümünde Ad bölümüne dugme1 girebiliriz. Etiket bölümüne ise Konum yaz girelim.

Yazı tipi bölümünden biraz daha büyük bir yazı tipi seçebiliriz.

Olaylar bölümünden İşlemi Çalıştır bölümündeki ... bölümüne tıklayalım.

Buradan Eylemi Çalıştır ve Makro yolunu takip edelim.

Makro Seçici bölümünde konum.ods’nin üzerine gelip konum ve konumYaz seçelim.

Tamam deyip bu pencereleri kapatalım.

Form Denetimleri araç çubuğunda T cetveline benzeyen düğmeye tıklayalım.

Böylece düğmenin etrafındaki kavun içi kareler kaybolacak.

Düğmeye bastığımızda konum bilgisinin yazıldığını görebilirsiniz.

Libre office konum yaz

Bir tane de içeriği silmek için düğme ekleyiniz. Bu düğmeyi de içeriği sil işlevine bağlayınız.

Derste kullanılan hesap tablosunu buradan indirebilirsiniz.

6 Beğeni

Selamunaleyküm
Hocam elinize sağlık, @yusufsunetci hocamızın dediği haricinde bir de bunları Pardus gönüllüleri sitesinde de paylaşabilir misiniz? Hem kayıtlı bir seri olur.

3 Beğeni

5.Ders : Renklere göre harcama kalemi oluşturmak

Giriş

Önceki derste bir arkadaşın sorduğu soruya bir çözüm geliştirmiştik.

Bu derste ise pratik bir uygulama geliştirmeye çalışıyoruz.

Renklere göre harcama kalemi oluşturmak

Aşağıdaki kütüğü

/home/erdem/.config/libreoffice/4/user/Scripts/python

dizinine masraf.py ismi ile kaydediniz.

Burada erdem yerine kendi kullanıcı adınızı seçiniz.

import uno

def rengeGoreTopla(renk):
    belge = XSCRIPTCONTEXT.getDocument()
    sayfa = belge.Sheets[0]
    renkliHücre = sayfa[renk]
    istediğimizRenk = renkliHücre.CellBackColor
    toplam = 0
    for satır in range(7, 500):
        for sütun in range(1, 2):
            hücre = sayfa.getCellByPosition(sütun, satır)
            if hücre.CellBackColor == istediğimizRenk:
                okunan = hücre.getValue()
                toplam += okunan
    renkliHücre.setString(str(int(toplam)))
    return

def  renkliTopla(birşeyler):
    renkliHücreler = { "E1", "E2", "E3" }
    for hücre in renkliHücreler:
        rengeGoreTopla(hücre)

Makroyu çalıştırdığınızda E1, E2 ve E3 hücrelerindeki renge göre aynı harcama kalemlerindeki verileri topluyor.

Renge göre harcama kalemlerini toplama

Veriler değiştiğinde makronun çalışması için alttaki Çizelge1’e sağ tıklayınız.

(Çizelge kötü bir çeviri olmuş. Sizde Sayfa1 yazıyorsa ona sağ tıklayınız.)

Sayfa Olayları -> İçerik değişti ata Makro yolunu takip ederek masraf içinden renkliTopla yı seçiniz.

Uygulama için oluşturduğumuz hesap tablosunu buradan indirebilirsiniz.

4 Beğeni

Bu konu son yanıttan 30 gün sonra otomatik olarak kapatıldı. Yeni yanıtlara artık izin verilmiyor.