LibreOffice Calc için python makro kaynağı

Merhaba Arkadaşlar,
Çalıştığım kurumda Excel yerine LibreOffice kullanmaktayım. Excel deki pratik makro imkanı libre de biraz daralıyor. LibreOffice Calc için Python makroları da yazılabiliyor. Tek sıkıntım bu konuda neredeyse hiç denecek kadar kaynak var.
VBA rahatlığında olmasa da benzer nesne komutları ile python ile makro yazabileceğim bir kütüphane de olabilir, iyi bir makro kaynağı var mıdır. Bu konuda çok araştırma yapsam da netteki kısıtlı kaynaklardaki bilgiler çok az ve sonuca ulaştırmıyor.
Belki de bu konuda excel vba siteleri gibi apayrı bir başlık etiketi oluşturmak gerekir.

Yanıtlarınız için teşekkür ederim.
mert.

Araştırma yaptığım wiki.documentfoundation.org ta basit bir örnek vardı.

import uno

def my_first_macro_calc():
    doc = XSCRIPTCONTEXT.getDocument()
    cell = doc.Sheets[0]['A1']
    cell.setString('Hello World in Python in Calc')
    return

Buradaki örnek sade, anlaşılır ve güzel. Ancak başka kaynaklarda yine starbasic sözdiziminde gördüğüm api uzantılarıyla karşılaşınca hayal kırıklığı oldu.

Bu kısa örneklerden XSCRIPCONTENT ve uno arayüzlerini araştırmak gerektiğini anlıyorum. Ne kadar doğru araştırmaya devam edeceğim.

Bu kodda uno içe aktarılmış ancak hiç kullanılmamış.

İşte çözmeye çalıştığım konu da bununla ilgili galiba. Burada uno kullanılmıyorsa XSCRIPTCONTENT adlı bir arayüz kullanılmış görünüyor. uno kullanılan örnekler StarBasic ile kullanıma çok benziyor ve python programlama sadeliğini bozuyor anladığım kadarıyla.
uno içeriğini python ile kullanan bir örnek kod(kaynak:https://onesheep.org/scripting-libreoffice-python/) aşağıya ekledim. Bu örnek calc değil de writer için. Ancak bu kodun ilkel bir notasyon olması muhtemel. LibreOfis teki Modern StarBasic te com.sun.star.frame bildirimleri hiç kullanılmıyor. Muhtemelen yeni uno api lerinde de kullanılmasına gerek yoktur. Ancak öyle olmasa bile bu söz dizimi gerçekten nahoş. python un estetiği ve kolay okunabilirliği de yok oluyor.

import uno

localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
model = desktop.getCurrentComponent()
text = model.Text
cursor = text.createTextCursor()
text.insertString(cursor, 'Hello world!', 0)

Merhaba.

Gerçekten ender kişiliklerdensiniz. Konfor alanınızı kırıp yeni şeyler öğrenmeye çalışmanız takdire şayan. :slight_smile:

Şuraya baktınız mı: https://api.libreoffice.org/examples/examples.html#python_examples

Anladığım kadarıyla uno modülü ile birlikte com.sun.star isim alanı içindekileri de kullanmanız gerekiyor. Python ve uno ile rahatsanız, şu belgedeki API’ı, kodunuza uyarlayarak, kullanabilirsiniz: https://api.libreoffice.org/docs/idl/ref/index.html

İyi çalışmalar.

Yanıtınız ve takdiriniz için teşekkür ederim ismail bey,
Bu kaynağı (api.libreoffice.org) biraz araştırayım ve testler yapayım. Gelişmeler olursa paylaşırım.
Her ne kadar LibreOffice ile basic ortamında birçok işi halletmek mümkün olsa da doğası gereği python ile daha etkili uygulamalar oluşturabileceğime inanıyorum. Python kodlarının en güzel yararlanılabileceği alanlardan birisi de bu excel/calc işlevsellikleri olurdu.
Saygılar sunuyorum.

1 Beğeni

Orjinal uno api leri incelerken başka kütüphanelere de baktım.
Şu linkteki oosheet adlı libreoffice python kütüphanesi oldukça temiz kodlar ile calc sheet lerini manipule etmeyi sağlayabiliyor. ihtiyaç duyabilecek arkadaşlar için eklemek istedim.
Bazı örnekler;

>>> from oosheet import OOSheet as S
>>> S('a1').string = 'Hello world'

>>> S('b2') # ilk sayfada bir hücreyi gösterir
>>> S('a1:10') # ilk sheet te a1 den a10 hücrelerine kadar olan bir sütun
>>> S('a1:a10') # yukarıdaki kod ile aynısını yapar
>>> S('a1:g1') # bir satır altı sütunu gösterir
>>> S('a1:g7') # 7x7 karelik 49 hücreyi gösterir
>>> S('Sheet2.a2:3') #  sheet2 adlı sayfadaki A2 and A3 hürelerini gösterir
>>> S('a2').formula = '=a1+10'  # a2 hücresine belirtilen formülü ekler

>>> for cell in S('a1:g10').find(u'word'):
>>>    # ilgili hücreleri işleyecek komutlar eklenebilir

gibi basitçe belirtimleri python ile rahat işleyebiliriz.

1 Beğeni