マクロ/Pythonガイド/文書操作
< Macros | Python Guide
TDF LibreOffice Document Liberation Project Community Blogs Weblate Nextcloud Redmine Ask LibreOffice Donate
OS上での文書管理
重要
pyUNOオブジェクトのメソッドの引数パスには、uno.systemPathToFileUrl(PATH)
関数を使用して常にURL形式のパスを使用します。Windowsユーザー向けの注意: パスの区切り記号はスラッシュ(/)を使います。
注意 以下に例を示しますが、USERは実際のユーザー名に置き換えてください。
新規文書を作成
import uno
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
# ここは下の2つのサンプルに共通のブロックです
def create_instance(name, with_context=False):
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
# Calc文書を開くには、このブロックのようにします
def new_doc_calc():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/scalc'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Writer文書を開くには、このブロックのようにします
def new_doc_writer():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/swriter'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# マクロを終了するには以下のようにします
g_exportedScripts = (new_doc_calc, new_doc_writer)
ほかの文書形式を利用するには、path
引数を指定します。
- Impress:
simpress
- Draw:
sdraw
- Math:
smath
注意
便利な関数からmsgbox
関数をコピーするかimportしておきます。
from com.sun.star.beans import PropertyValue
def new_doc_args():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/sdraw'
args = (PropertyValue(Name='Hidden', Value=True),)
doc = desktop.loadComponentFromURL(path, '_default', 0, args)
msgbox(doc.Title)
doc.close(True)
return
- Baseの新規文書を開くには、このようにします
def new_db():
path = uno.systemPathToFileUrl('/home/USER/newdb.odb')
dbc = create_instance('com.sun.star.sdb.DatabaseContext')
db = dbc.createInstance()
db.URL = 'sdbc:embedded:firebird'
db.DatabaseDocument.storeAsURL(path, ())
return
ファイルを開く
重要 ファイルパスには、URL形式を使用することを忘れないでください。
path = uno.systemPathToFileUrl('/home/USER/calc.ods')
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
- 引数を指定して開く
from com.sun.star.beans import PropertyValue
def open_args():
path = uno.systemPathToFileUrl('/home/USER/writer.odt')
desktop = create_instance('com.sun.star.frame.Desktop', True)
args = (PropertyValue(Name='Password', Value='letmein'),)
doc = desktop.loadComponentFromURL(path, '_default', 0, args)
return
- 共通して利用できる引数
args = {'Hidden': True}
args = {'ReadOnly': True}
args = {'Preview': True}
# 文書内でマクロを有効化する
args = {'MacroExecutionMode': 4}
# テンプレートから文書を開く(True)。または編集するためにテンプレートから文書を開く(False)。
args = {'AsTemplate': True}
イテレーターを使ってすべての文書を開く
desktop = create_instance('com.sun.star.frame.Desktop', True)
for doc in desktop.getComponents():
msgbox(doc.Title)
現在の文書を取得
doc = XSCRIPTCONTEXT.getDocument()
msgbox(doc.Title)
# 上と同じことを行う別の方法
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.getCurrentComponent()
msgbox(doc.Title)
PDFにエクスポートする
PDFのエクスポートについて、その他のオプションは PDFエクスポートフィルターをご覧ください。
- Calc文書をPDFにエクスポートする
from com.sun.star.beans import PropertyValue
def dict_to_property(values, uno_any=False):
ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()])
if uno_any:
ps = uno.Any('[]com.sun.star.beans.PropertyValue', ps)
return ps
def main():
path_pdf = uno.systemPathToFileUrl('/home/mau/calc.pdf')
doc = XSCRIPTCONTEXT.getDocument()
args = {
'FilterName': 'calc_pdf_Export',
}
args = dict_to_property(args)
doc.storeToURL(path_pdf, args)
return
- オプションを指定してエクスポートする
def main():
path_pdf = uno.systemPathToFileUrl('/home/mau/calc.pdf')
doc = XSCRIPTCONTEXT.getDocument()
args = {
'EncryptFile': True,
'DocumentOpenPassword': 'letmein',
}
filter_data = dict_to_property(args, True)
args = {
'FilterName': 'calc_pdf_Export',
'FilterData': filter_data,
}
args = dict_to_property(args)
doc.storeToURL(path_pdf, args)
return
LibreOfficeでの文書管理
文書形式を取得する
def get_type_doc(doc):
TYPE_DOC = {
'calc': 'com.sun.star.sheet.SpreadsheetDocument',
'writer': 'com.sun.star.text.TextDocument',
'impress': 'com.sun.star.presentation.PresentationDocument',
'draw': 'com.sun.star.drawing.DrawingDocument',
'base': 'com.sun.star.sdb.DocumentDataSource',
'math': 'com.sun.star.formula.FormulaProperties',
'basic': 'com.sun.star.script.BasicIDE',
}
for k, v in TYPE_DOC.items():
if doc.supportsService(v):
return k
return ''
def main():
doc = XSCRIPTCONTEXT.getDocument()
msgbox(get_type_doc(doc))
return
現在の文書にフォーカスを設定する
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setFocus()
文書を表示、非表示にする
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setVisible(False)
msgbox(doc.Title)
win.setVisible(True)
文書のズーム率を設定
doc = XSCRIPTCONTEXT.getDocument()
doc.getCurrentController().ZoomValue = 150
選択している範囲を取得
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
msgbox(sel.ImplementationName)
ステータスバーの管理
- このコードを試します
from time import sleep
def main():
doc = XSCRIPTCONTEXT.getDocument()
statusbar = doc.getCurrentController().getStatusIndicator()
statusbar.start('Line', 10)
for i in range(10):
statusbar.setValue(i)
sleep(1)
# ~ Is important free status bar
statusbar.end()
return
- 実行がブロックされているため、何も表示できません。
次に、これを試します。:
import threading
from time import sleep
def run_in_thread(fn):
def run(*k, **kw):
t = threading.Thread(target=fn, args=k, kwargs=kw)
t.start()
return t
return run
@run_in_thread
def update_status_bar(statusbar, text, limit):
statusbar.start(text, limit)
for i in range(limit):
statusbar.setValue(i)
sleep(1)
# ~ Is important free status bar
statusbar.end()
return
def main():
doc = XSCRIPTCONTEXT.getDocument()
statusbar = doc.getCurrentController().getStatusIndicator()
update_status_bar(statusbar, 'Line', 10)
return