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

注意)
このページのマクロは、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( 表計算 ) 】
http://openoffice3.web.fc2.com/Python_Macro_Calc.html#OOoCCB02a

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

メッセージボックスのパラメーターが１つ多い等、最初の方のメッセージボックスはほとんどがエラーになります。以下の修正が必要です。
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'に変更する。~~
メッセージボックスの所でエラーが発生してメッセージボックスが表示されません。修正したコードです。

```python: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までのセルに全て１を入力してから実行する。

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

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

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

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

CCI-)[Calc]Cellの削除(1)[既存データは上方向に移動] メッセージボックスの部分修正が必要です。（上記参照）
マクロを実行する前に、下記のようにセルに入力する。
 |A B  C  D  E  F  G　　　やり方（これを保存しておく）
--------------------　　A1に「１」を入力する。
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の書式文字列を変更しても同じ。？？？

http://excelwork.info/excel/numberformatp/

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

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

```python: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

https://wiki.openoffice.org/wiki/Extensions_development_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