注意)
このページのマクロは、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'に変更する。
メッセージボックスの所でエラーが発生してメッセージボックスが表示されません。修正したコードです。
# -*- 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が使用されているのでコピペする場合注意が必要。
# !
# 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