7
15

More than 5 years have passed since last update.

LibreOffice Pythonマクロ サンプルプログラム(初級者向け)

Last updated at Posted at 2018-02-21

注意)
このページのマクロは、Libreofficeの「マクロの実行」で動作させます。

LibreOfficeでPythonマクロを実行するには、
UbuntuのLibreOffice(MS Office互換性あり)でPythonマクロを使用する方法(超初級者向け)
https://qiita.com/ty21ky/items/2c8b001363c8293198e2
を参照ください。

環境

  Ubuntu Studio 17.10
  LibreOffice6.0

よく考えたら、普通はPythonを知っているからLibreOffice Pythonマクロを始めるのであって、私のようにLibreOffice Pythonマクロを使うためにPythonを始めた初級者はいないか?

私はPythonを始めたばかりで、自分でプログラムをすべて最初から作ることが出来ません。

ネット上にサンプルプログラムが沢山あるので、参考にして使用しています。

しかし、サンプルプログラムは仕様が変更?になったのかそのまま使用出来ないことが多いです。
少し変更すれば使用することが出来ます。

Macroの杜

【 Calc( 表計算 ) 】

下記の修正点を見る前に自分で上記のサイトのコードで実行し、エラーが出たら、自分で何処にバグがあるか探す練習をしてください。

メッセージボックスのパラメーターが1つ多い等、最初の方のメッセージボックスはほとんどがエラーになります。以下の修正が必要です。
from com.sun.star.awt import Rectangle

from com.sun.star.awt.MessageBoxType import MESSAGEBOX
に変更する。

msgbox = toolkit.createMessageBox(window, Rectangle(), oMsgType, oBtnType, oTitle, oMessage)

msgbox = toolkit.createMessageBox(window, MESSAGEBOX, oBtnType, oTitle, oMessage)
に変更する。

メッセージボックスタイプ'messbox'は何故か?エラーになるので'infobox'に変更しています。(上記の修正で治っているかも)

一部のコードの字下げに「半角スペース」と「Tab」が混在しているものがあり、コードをコピペで貼り付けた場合、マクロ実行のダイアログに表示されないので実行出来ません。修正が必要です。

下記のものは動作することを確認しました。
動作確認して追加していきます。
*******[ Macro Code ]*******

Cell操作

[ Basic ]

CCB-)[Calc]Cellに値を入力1(文字列) *変更必要箇所('c:\temp\oootest.ods')
CCB-)[Calc]Cellに値を入力2(数字 / 数式) *変更必要箇所('c:\temp\oootest.ods')
CCB-)[Calc]Cellに値を入力3(数字 / 数式 / 文字列) メッセージボックスの部分修正が必要です。(上記参照)
CCB-)[Calc]Cellから値取得 *変更必要箇所('c:\temp\oootest.ods')
              「Rectangle(),」を削除する。
               'messbox'を'infobox'に変更する。
メッセージボックスの所でエラーが発生してメッセージボックスが表示されません。修正したコードです。

Cell.py
# -*- coding: utf-8 -*-

import uno
import unohelper
import os.path

from com.sun.star.awt.MessageBoxType import MESSAGEBOX

def omsgbox(oMessage='',oBtnType=1,oTitle='Title',oMsgType='messbox'):
    """shows message."""
    desktop = XSCRIPTCONTEXT.getDesktop()
    frame = desktop.getCurrentFrame()
    window = frame.getContainerWindow()
    toolkit = window.getToolkit()
    msgbox = toolkit.createMessageBox(window, MESSAGEBOX, oBtnType, oTitle, oMessage)
    return msgbox.execute()

def oMacroTest():
    try:
        ofile= os.path.abspath('/media/ty/HD-LCU3/linux/program/LibreOffice/python/calc/oootest.ods')
        oURL = unohelper.systemPathToFileUrl(ofile)
    #
        desktop = XSCRIPTCONTEXT.getDesktop()
        oDoc = desktop.loadComponentFromURL( oURL,"_blank", 0, () )
    #
        oSheet = oDoc.getSheets().getByIndex(0)
    #
        oSheet.getCellByPosition(0,0).Value = 3
        oSheet.getCellByPosition(0,1).Value = 2
        oSheet.getCellByPosition(0,2).Formula = "=sum(A1:A2)"
    #
        oVal = oSheet.getCellByPosition(0,2).Value
        oDisp = oVal
    #
        omsgbox(oDisp)
    except:
        pass

[ Insert・Delete.Copy ]

CCI-)[Calc]Cellの追加(1)[既存データは下方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
   A1〜G10までのセルに全て1を入力してから実行する。

CCI-)[Calc]Cellの追加(2)[既存データは右方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
   A1〜G10までのセルに全て1を入力してから実行する。

CCI-)[Calc]Cellの追加(3)[行全体が下方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
   A1〜G10までのセルに全て1を入力してから実行する。

CCI-)[Calc]Cellの追加(4)[列全体が右方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
   A1〜G10までのセルに全て1を入力してから実行する。

CCI-)[Calc]Cellの追加(5)[右・下・行全体・列全体が移動] メッセージボックスの部分修正が必要です。(上記参照)
   A1〜G10までのセルに全て1を入力してから実行する。
   oProp.Value = 'V'を'>','R','C'に変更して実行する。Calcは起動し直す。

CCI-)[Calc]Cellの削除(1)[既存データは上方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、下記のようにセルに入力する。
|A B C D E F G   やり方(これを保存しておく)
--------------------  A1に「1」を入力する。
1|1 2 3 4 5 6 7   A1セルを選択する。
2|2 3 4 5 6 7 8   セルの右下に■が表示される。
・・・・・・・・・・     ■を下方向にドラッグする。
14|14 15 16 17 18 19 20  A1〜A14セルを選択する。
         ■を右方向にドラッグする。
             

CCI-)[Calc]Cellの削除(2)[既存データは左方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する。

CCI-)[Calc]Cellの削除(3)[行全体が上方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する。

CCI-)[Calc]Cellの削除(4)[列全体が左方向に移動] メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する

CCI-)[Calc]Cellの削除(左・上・行全体・列全体が移動) メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する。
oProp.Value = 'U'を'L','R','C'に変更して実行する。Calcは起動し直す。

CCI-)[Calc]CellのCOPY--- メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する。

CCI-)[Calc]CellのCOPY2--- メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する。
Sheet2が無い時は作成しておく。

CCI-)[Calc]Cell範囲のCOPY3--- メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、<Cellの削除(1)>のようにセルに入力する。
Sheet2が無い時は作成しておく。

CCI-)[Calc]形式を選択して貼り付け--- メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、A1〜B2までに1を入力する。
A1を選択し、セルの書式設定で「テキスト」「バックグランドカラーを黄色」にする。

[ Property(Cellの書式設定) ]

CCProp-)[Calc]直接設定した書式の解除--- メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、イメージの左側のように設定・入力する。

{{ Format }}

CCPF-)[Calc]Cellの表示形式Key No.取得---メッセージボックスの部分修正が必要です。(上記参照)

CCPF-)[Calc]Cell数値の表示形式を設定1--- メッセージボックスの部分修正が必要です。(上記参照)
マクロを実行する前に、Sheet1、A1セルに10000000を入力する。
A列セルの幅を広くしておく。

CCPF-)[Calc]Cell数値の表示形式を設定2--- メッセージボックスの部分修正が必要です。(上記参照)
私の環境では、20000は表示されるが\20,000とはならない。
oCell.NumberFormat = 10103の書式文字列を変更しても同じ。???

CCPF-)[Calc]Cell数値の表示形式を設定3--- メッセージボックスの部分修正が必要です。(上記参照)
実行前にA1セルに30000と入力する。

CCPF-)[Calc]Content Type of Cell---メッセージボックスの代わりにA2セルに表示するように変更する。
このコードの字下げに半角スペースではなく、Tabが使用されているのでコピペする場合注意が必要。

test1.py
#!
#coding: utf-8
# python Marco
import uno
import sys
import traceback
from com.sun.star.awt import Rectangle
#

def oMacroTest():

        oDoc = XSCRIPTCONTEXT.getDocument()
        oSheet = oDoc.getSheets().getByName('sheet1')
        oCell=oSheet.getCellRangeByName('A1')
        oCell.String = 'LibreOffice'            # string : NG
        oType = oCell.getType()
        #
        if oType == uno.Enum('com.sun.star.table.CellContentType', 'EMPTY'):
            oDisp = 'Empty'
        elif oType == uno.Enum('com.sun.star.table.CellContentType', 'VALUE'):
            oDisp = 'Value'
        elif oType == uno.Enum('com.sun.star.table.CellContentType', 'TEXT'):
            oDisp = 'Text'
        elif oType == uno.Enum('com.sun.star.table.CellContentType', 'FORMULA'):
            oDisp = 'Formula'
        else:
            oDisp = 'UnKnown'

        oCell1=oSheet.getCellRangeByName('A2')
        oCell1.String = oDisp

CCPF-)[Calc]User Defined Attributes---メッセージボックスの部分修正が必要です。(上記参照)

CCPF-)[Calc]固有Format Range---メッセージボックスの部分修正が必要です。(上記参照)

{{ Font }}

CCPFt-)[Calc]Cell幅に合わせて改行(1)--- メッセージボックスの部分修正が必要です。(上記参照)
A1のセルの高さを大きくしておく。

CCPFt-)[Calc]Cell幅に合わせて改行(2)--- メッセージボックスの部分修正が必要です。(上記参照)
A1のセルの高さを大きくしておく。
A1セルにaaaaaaaaaaaaaaaaaaa等の文字列がセルからはみ出るように入力しておく。

CCPFt-)[Calc]文字関連の Property 一覧--- メッセージボックスの部分修正が必要です。(上記参照)
A2のセルの高さを大きくしておく。

CCPFt-)[Calc]文字列の右1文字を下付文字にする--- メッセージボックスの部分修正が必要です。(上記参照)

CCPFt-)[Calc]Cellの背景色設定(1)--- メッセージボックスの部分修正が必要です。(上記参照)
このコードは、半角スペースとTabが混在しているので、コピペした場合、どちらかに統一しないと、表示されないので実行できない。
変更必要箇所('c:/temp/MacroCalc.ods')

CCPFt-)[Calc]Cellの背景色設定(2)--- メッセージボックスの部分修正が必要です。(上記参照)

CCPFt-)[Calc]文字の角度(1)--- メッセージボックスの部分修正が必要です。(上記参照)
A1〜A6のセル高さを大きくしておく。

CCPFt-)[Calc]文字色 / 文字Size / 文字太さ 設定--- メッセージボックスの部分修正が必要です。(上記参照)
このコードは、半角スペースとTabが混在しているので、コピペした場合、どちらかに統一しないと、表示されないので実行できない。
変更必要箇所('c:/temp/MacroCalc.ods')

CCPFt-)[Calc]縦書き---メッセージボックスもエラーなし
A1セルの高さを大きくしておく。

{{ Font Effet }}

CCFEt-)[Calc]各種UnderLine設定---メッセージボックスもエラーなし
A,B列の幅を大きくする。

CCFEt-)[Calc]下線色 / Color of Underline---メッセージボックスもエラーなし

CCFEt-)[Calc]影付き文字(1)---メッセージボックスもエラーなし

CCFEt-)[Calc]影付き文字(2)---メッセージボックスもエラーなし

CCFEt-)[Calc]各種取消し線(1)---メッセージボックスもエラーなし

CCFEt-)[Calc]各種取消し線(2)---メッセージボックスもエラーなし

CCFEt-)[Calc]各種OverLine---メッセージボックスもエラーなし

CCFEt-)[Calc]浮き出し/浮き彫り文字(1)---メッセージボックスもエラーなし

CCFEt-)[Calc]浮き出し/浮き彫り文字(2)---メッセージボックスもエラーなし

CCFEt-)[Calc]中抜き文字(1)---メッセージボックスもエラーなし

CCFEt-)[Calc]中抜き文字(2)---メッセージボックスもエラーなし

{{ Position / Size }}

CCPoSz-)[Calc]Cell内のPosition設定(1)[縦方向]---メッセージボックスもエラーなし

CCPoSz-)[Calc]Cell内のPosition設定(2)[横方向]---メッセージボックスもエラーなし

CCPoSz-)[Calc]Cell内のPosition設定(3)[縦横方向]---メッセージボックスもエラーなし

[ Clear ]

CCPFt-)[Calc]Claer contents(1)---メッセージボックスもエラーなし
A1〜D5まで適当に入力する。
D3にコメントを挿入する。

[ Address ]

CCAd-)[Calc]Current CellのAddress取得(1)---メッセージボックスの部分修正が必要です。(上記参照)
適当にセルを選択してから、マクロを実行する。

CCAd-)[Calc]最終行No.の取得(1)---メッセージボックスの部分修正が必要です。(上記参照)
A列に適当に空白も交えて入力する。

CCAd-)[Calc]最終行No.の取得(2)---メッセージボックスの部分修正が必要です。(上記参照)
A列に適当に空白も交えて入力する。

[ Hyper Link ]

CHy-)[Calc]Hyper Link---メッセージボックスもエラーなし

[ Array ]

CCD-)[Calc]指定範囲のDataを全て取得---メッセージボックスの部分修正が必要です。(上記参照)
A1〜B6まで適当に入力する。

Sheet

CS-)[Calc]Sheet Name取得---メッセージボックスの部分修正が必要です。(上記参照)
メッセージボックスの部分修正に伴い
def omsgbox(desktop,message):

def omsgbox(desktop,oMessage,oBtnType=1, oTitle='Title'):
に変更する。
変更必要箇所('c:\temp\oootest.ods')

CS-)[Calc]Sheet Name変更---メッセージボックスの部分修正が必要です。(上記参照)
メッセージボックスの部分修正に伴い
def omsgbox(desktop,message):

def omsgbox(desktop,oMessage,oBtnType=1, oTitle='Title'):
に変更する。
変更必要箇所('c:\temp\oootest.ods')

File

CF-)[Calc]新規Calc file起動

CF-)[Calc]指定Calc file起動
変更必要箇所('c:\temp\oootest.ods')

CF-)[Calc]指定Calc file保存(上書き保存)---メッセージボックスの部分修正が必要です。(上記参照)
メッセージボックスの部分修正に伴い
def omsgbox(desktop,message):

def omsgbox(desktop,oMessage,oBtnType=1, oTitle='Title'):
に変更する。
変更必要箇所('c:\temp\oootest.ods')

Apache OpenOffice Developer's Guide
https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

Apache OpenOffice Python PYUNO
https://wiki.openoffice.org/wiki/Python

FR/Documentation/Python/Python as a macro language
https://wiki.openoffice.org/wiki/FR/Documentation/Python/Python_as_a_macro_language

Several ways to time stamps
https://wiki.openoffice.org/wiki/Python/WaysToTimeStamps

Example of Service in Python
https://wiki.openoffice.org/wiki/Example_of_Service_in_Python

Python as a macro language
https://wiki.openoffice.org/wiki/Python_as_a_macro_language

Calc/Add-In/Python How-To
https://wiki.openoffice.org/wiki/Calc/Add-In/Python_How-To

Python es
https://wiki.openoffice.org/wiki/Python_es

Trabajando con Calc
https://wiki.openoffice.org/wiki/ES/Manuales/GuiaAOO/TemasAvanzados/Macros/Python/PythonCalc

7
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
15