顯示具有 libreoffice 標籤的文章。 顯示所有文章
顯示具有 libreoffice 標籤的文章。 顯示所有文章

星期四, 4月 19, 2012

OpenOffice/LibreOffice Calc Macros(5)

受不了,還是用「錄製巨集」的方式來寫,因為真的很多函數的用法都不容易找到,找到了,也需要測試測試再測試,太花時間。錄製出來的BASIC語法,基本上都是利用 Dispatcher 然後帶參數去告訴 calc 該做些什麼事情,所以像是在一個格子裡輸入文字,錄製出來的結果會是先 Goto 到指定的儲存格,然後再去填文字。

即便是如此,要轉換為 Python,也需要不少工夫。下面幾篇是我找到的資料,非常有參考價值,一般錄製出來的BASIC函式,這幾篇都有對應的 Python 可以用:

第一個取得 dispatcher 會遇到的 createUnoService ,實際上程式是這樣子的:

def createUnoService( cClass ):
    """A handy way to create a global objects within the running OOo.
    """
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    obj = smgr.createInstance( cClass )
    return obj

第二個是建立 com.sun.star.beans.PropertyValue ,程式是這樣子的:

    args1 = uno.createUnoStruct( "com.sun.star.beans.PropertyValue" )
    args1.Name = "ToPoint"
    args1.Value = "$A$2"

然後是 dispatcher.executeDispatch(),在錄製出來的巨集裡,第一個參數是叫做 document,這個其實是XSCRIPTCONTEXT.getDocument().getCurrentController().getFrame() ,真的是很長;第二個參數是動作字串;第3個跟第4個參數都沿用錄製出來的參數;最後一個參數才是問題,這個要傳 tuple 進去,而且要多加一個空的元素在後面,例如 (arg0,)。

組合上面提到的,要在一個 sheet 裡的 A2 填字串,就是這樣子:

    # 取得必要的變數
    doc = XSCRIPTCONTEXT.getDocument()
    controller = doc.getCurrentController() 
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

    # 到 A2
    args1 = uno.createUnoStruct( "com.sun.star.beans.PropertyValue" )
    args1.Name = "ToPoint"
    args1.Value = "$A$2"
    dispatcher.executeDispatch(controller.getFrame(), ".uno:GoToCell", "", 0,
            (args1,))

    # 填字串
    args2 = uno.createUnoStruct( "com.sun.star.beans.PropertyValue" )
    args2.Name = "StringName"
    args2.Value = "2012/4/12"
    dispatcher.executeDispatch(controller.getFrame(), ".uno:EnterString", "",
            0, (args2,))

找的時候,有找到一篇 oosheet,這個 module 把 calc sheet 的相關部分都包起來了,看起來很好用,晚點來研究看看。

星期一, 4月 16, 2012

OpenOffice/LibreOffice Calc Macros(4)

填日期的方法,參考這篇:Calc Examples

簡單的說,日期要先丟 "d/m/y" 的值進去,或者是用設定公式的方式去設定日期,然後再去設定 format。

    oDoc = XSCRIPTCONTEXT.getDocument()
    oSheet = oDoc.Sheets.getByIndex(0)

    oSheet.getCellByPosition( 0, 0 ).setFormula( "=DATE(2004;09;30)" )
    oSheet.getCellByPosition( 0, 1 ).setFormula( "10/31/2004" )
    oSheet.getCellRangeByName( "A3" ).setFormula( "12/31/2004" )

    #-----
    # Format the date cells as dates.
    com_sun_star_util_NumberFormat_DATE = uno.getConstantByName( "com.sun.star.util.NumberFormat.DATE" )
    oFormats = oDoc.getNumberFormats()
    oLocale = uno.createUnoStruct( "com.sun.star.lang.Locale" )
    nDateKey = oFormats.getStandardFormat( com_sun_star_util_NumberFormat_DATE, oLocale )
    oCell = oSheet.getCellRangeByName( "A1:A3" )
    oCell.NumberFormat = nDateKey

至於要改格式為 YYYY/MM/DD 的方法,我還沒研究出來。

星期一, 4月 09, 2012

OpenOffice/LibreOffice Calc Macros(3)

這篇文章是從 LibreOffice 的輔助說明裡挖出來的,列出了所有可用的服務、控制項以及控制項裡的屬性,相當的實用,給我很大的幫助。再搭配這篇教你如何建立對話盒文章裡的範例-dynamicDialog.py,就可以打造出自己的對話盒,並且顯示出來。
在試驗 DateModel (就日期控制項)時,發現了幾個有趣的事情:
  • Date 屬性的指定,必須是 20120408 這樣子的數字,所以以 python 來說就是 int( datetime.now().strftime("%Y%m%d") )
  • 指定 Dropdown 屬性為 True 以後,才會出現可以下拉的小按鈕,讓使用者可以簡易的選擇日期,不必手動輸入。
在翻找 LibreOffice 安裝目錄時,發現裡面就把 Python 2.6.1 包進去了,所以不需要額外安裝 Python,就可以使用 Python,這樣就可以跨平台了。

星期五, 4月 06, 2012

OpenOffice/LibreOffice Calc Macros(2)

為了想用內建的 BASIC 語法來抓網站內容,找了好一陣子,找到 OpenOffice 文件正體中文化網站OOo中文手冊網站 也利用Google爬了一些文,然後也看了 LibreOffice 的輔助說明,發現似乎沒有很方便的函數來做這件事情。

然後,又回頭試了 Python,這次是在 Windows 上試,要寫 script 的話,要把 script 放在 %USERPROFILE%\Application Data\LibreOffice\3\user\Scripts\python 下,這樣就可以執行了。當使用 [工具][巨集][執行巨集] 打開「巨集選擇器」以後,就可以在對話盒左邊的「我的巨集」項目裡找到你程式裡的函式,然後就可以選擇要執行哪一個了。

def main():
    # 取得當前文件
    doc = XSCRIPTCONTEXT.getDocument()
    # 取得第一張工作表
    sheet = doc.Sheets.getByIndex(0)

    # 填字串,一般字串跟 unicode 字串都可以
    sheet.getCellRangeByName("A4").String = sys.version
    sheet.getCellRangeByName("A5").String = "Hello World"
    sheet.getCellRangeByName("A6").String = u"Hello world2"

使用 python 的話,要抓檔案或是要做什麼複雜處理的,就很方便了,需要什麼函式庫,就自己裝上去就行。但是缺點就是失去了部分的可攜性,在沒有 python 的環境下,無法執行。

星期一, 4月 02, 2012

OpenOffice/LibreOffice Calc Macros(1)

以下都在 Ubuntu 下進行。
目標是想做股市資料的蒐集跟分析。
首先想到,看可不可以做到像 Excel 一樣做 Web 查詢,Calc 的確有類似功能,Insert > Link to External Data 就是,輸入網址以後,速度相當慢,首先會問你語系,選 Automatic,然後過一段時間以後,會把該網頁裡的所有 table tag 都列出來,有 id 屬性的會顯示 id,沒有的,會用流水號代替,所以你不知道要匯入哪一個 table。Excel 在這裡會顯示一個預覽的視窗,並且將可以匯入的部份框起來,左上角有小圖示,按了以後就可以匯入,相較之下,Calc 一整個弱掉。
那就只 能寫 Scripts 了,我花了一個小時在找 macro 存放的位置,大概是我裝過太多版本,所以家目錄下有 .openoffice 跟 .libreoffice 這兩個目錄,可是我存了 macro,這兩個目錄下都沒有,LibreOffice 的 wiki 上說是在 .libreoffice 下,我找了又找,就是沒有。本有想用 find 找,可是我家目錄下好多東西,想說不要花那個時間,但最後我還是用了。就目前 LibreOffice 3.5.1 來說,位置是放在 .config/libreoffice/3/user/basic 下。
我發現這方面的入門文相當相當的混亂而且少,目前看到還是 Wiki 上較多...