OpenOffice/LibreOffice’te Python ile Makro Programlama [TR]

Açık kaynak yazılım kullanımı gün geçtikçe artmakta. LibreOffice ve OpenOffice de Microsoft Office uygulamalarının açık kaynak kodlu rakipleri. Bu iki yazılımın farkından biraz bahsedecek olursak LibreOffice şu an Ubuntu, Fedora gibi Linux dağıtımlarında kurulu olarak gelmekte olan ofis programı. OpenOffice ise daha az kullanılıyor ve Oracle’ın çatısı altında. Bu yazı dizimde LibreOffice kullanacağım fakat yapacağım her şey OpenOffice’te de çalışmaktadır.
LibreOffice Bileşenleri
LibreOffice dört ana bileşenden oluşmaktadır. Bunlardan Writer Microsoft Office’de Word’e, Calc Excel’e, Impress PowerPoint’e, Draw Visio’ya denk düşmektedir.
Makro Kullanımına Başlamak
LibreOffice’te makro kullanımına başlamak için önce yapmamız gereken ayarlar var. Şimdi o ayarları yapalım.
LibreOffice > Araçlar >Ayarlar > LibreOffice > Güvenlik kısmına gidelim.

Makro Güvenliği > Orta yapalım.

Böylelikle LibreOffice kendi makrolarımızı kullanmamıza izin verecek fakat kaynağını bilmediğimiz makrolardan da bizi koruyacaktır.
Neden Python?
Makrolar ofis ortamı için yazılmış scriptlerdir. Bu scriptler Universal Network Objects(UNO) sayesinde LibreOffice API’si kullanılarak pek çok farklı dilde yazılabilmektedir. Bu diller; Visual Basic, Java, C/C++, Javascript, Python olarak sıralanabilir.
Peki hangi dili seçmeliyiz? LibreOffice çapraz platform olduğu için oluşturduğumuz belgeler Mac, Windows Linux gibi farklı platformlarda kullanılabilmektedir. Makrolarımızın da farklı platformlara uyumlu olması için bizim de çapraz platformla uyumlu bir dil seçmemiz uygun olacaktır. Visual Basic’i bu yüzden eleyelim.
Java ve C/C++ da derlemeye ihtiyaç duyuyor ve ihtiyaç duymayacağımız kadar detaylı diller, bunları da eleyelim.
JavaScript ise sayılarla çalışacağımızda sorun çıkaracaktır. Örneğin Javascrip'te0.1 + 0.2 işlemi 0.3’e eşit değil yani sayı yuvarlamada sıkıntı çıkıyor. Bu yüzden JavaScript’i de eleyelim. Python ise sayısal işlemlerde kütüphaneleri sayesinde gayet güçlü. Numpy, Numexpr gibi kütüphaneler bu iş için biçilmiş kaftan. Bu yüzden seçimimizi Python’dan yana yapıyoruz. Ben bu yazıyı yazarken Python 2'ye elveda dememize sayılı günler kaldığı için Python 3 kullanacağımızı da belirteyim.
Komut Satırından LibreOffice’e Bağlanmak
Kendi makromuzu oluşturmadan önce komut satırından LibreOffice’e bağlanarak Python ile LibreOffice’i nasıl yönetebileceğimizi görelim.
Öncelikle LibreOffice Calc’ı açık soketle komut satırından açalım.
Linux için:
soffice --calc --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"Güncelleme: Libreoffice güncellediğimden beri soffice komutu çalışmıyor. Bunu şimdilik soffice’in bulunduğu konuma gidip manuel olarak çalıştırmakla çözdüm. Sizde de aynı sıkıntı varsa bunu deneyebilirsiniz.
/opt/libreoffice$VERSION/program/soffice --calc --$VERSION yazan yere LibreOffice’inizin sürümü gelecek.
Mac OS için:
/Applications/LibreOffice.app/Contents/MacOS/soffice --calc \
--accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"Windows için :
"C:\\Program Files (x86)\LibreOffice 5\program\soffice.exe" --calc --accept="socket,host=localhost,port=2002;urp;"komutlarını komut satırna girelim.
Bu kısımda sorun yaşıyorsanız buradan yardım alabilirsiniz.
Calc açıldığına göre şimdi Python Shell’i açalım.
Linux için:
LibreOffice’i açtığımız Terminal meşgul olduğu için oraya herhangi bir komut giremeyiz. Bu yüzden bu terminali kapatmadan yeni bir terminal açalım.
python3Günceclleme: Eğer ana Python yorumlayıcınız UNO ile uyumlu değilse bir sonraki adımda şöyle bir hatayla karşılacaksınız:
ModuleNotFoundError: No module named ‘unoBu olursa LibreOffice’i kendi yüklemesinin yanında gelen Python yorumlayıcısı ile kullanmanız gerekir Bunu da şurda bulabilirsiniz.
/opt/libreoffice$VERSION/program/pythonMac OS için:
/Applications/LibreOffice.app/Contents/MacOS/pythonWindows için :
"C:\\Program Files (x86)\LibreOffice 5\program\python.exe"yazarak Python’u başlatalım. Açılan shell’de şu komutları girelim.
import socket # sadece win32-OOo3.0.0te gerekiyor.
import uno
# PyUNO runtime dan Uno bileşeninin içeriğini al
localContext = uno.getComponentContext()
# UnoUrlResolver ı oluştur
resolver = localContext.ServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", localContext )
# çalışmakta olan ofise bağlan
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager
# ana masaüstü objesini al
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
# şu anki dökümana eriş
model = desktop.getCurrentComponent()
Bu satırlar Calc, Writer, Impress ve Draw için tamemen ortaktır.
Artık döküman ile etkileşime geçelim.
LibreOffice’i --calc parametresi ile açtığımız için tablo komutlarını deneyelim.
# active sheet e eriş (aktif olan calc sayfası)
active_sheet = model.CurrentController.ActiveSheet# C4 hücresine eriş
cell1 = active_sheet.getCellRangeByName("C4")# İçine yazı yaz
cell1.String = "Hello world"# E6'nın değerini bir arttır
cell2 = active_sheet.getCellRangeByName("E6")
cell2.Value = cell2.Value + 1
LibreOffice’i --writer parametresi ile açarsak aşağıdaki işlemleri de yapabiliriz.
# Dökümanın yazı özelliğine ulaş
text = model.Text# Bir imleç oluştur
cursor = text.createTextCursor()# Dökümana yazı ekle
text.insertString( cursor, "Hello World", 0 )
Tebrikler! Artık python ile LibreOffice’i dışarıdan kontrol edebiliyorsunuz. Bu yazımı burada bitiriyorum. Bir dahaki yazımda gömülü makrolardan bahsedeceğim. Hoşça kalın :)
Bu yazı dizisini oluştururken başvurduğum önemli kaynaklar:
