実行した環境
Ubuntu Stdio 17.10
Python 3.6.3
LibreOffice 6.0
UbuntuのPythonでCalcを操作する
https://qiita.com/ty21ky/items/b31cecf25108f15940be
では、UbuntuのPython3で実行するとエラーがでる場合が多く、pyoocalc.pyのソースを覗いても私のレベルでは中々理解出来ないので、ネットでLibreOfficeの起動のやり方を探していたら、もっと簡単でインストールもしなくてよい方法が見つかりました。
2ヶ月位前にも見ていたのですが、その時は何が書かれているか理解出来なかったのですが、今回見て私がやりたいものそのものでした。
インストールも何も必要としません。ただ、UNOをUbuntuのPython3が使用出来るようにパスを通すだけです。
私は、Pythonからパスを通していますが、環境変数に加えてもよいような気もします。詳しいことは下記のHPを見てください。
今回は、LibreOfficeを通信状態で起動してからPythonを実行していますが、Pythonから起動することもできるようです。
graph1.odsを作成する
下記のイメージを参考に作成して保存し閉じておく。
LibreOfficeを通信状態で起動
パスは環境に合わせ変更してください。
$ /opt/libreoffice6.0/program/soffice "-accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"
# !/usr/bin/python3
# -*- coding: utf-8 -*-
# UNOのパスを通す
import sys
sys.path.append('/opt/libreoffice6.0/program')
import uno
import unohelper
import os.path
import traceback
import matplotlib.pyplot as plt
import numpy as np
def connect():
try:
localctx = uno.getComponentContext()
resolver = localctx.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver",localctx)
ctx = resolver.resolve(
"uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
except:
return None
return ctx
if __name__=="__main__":
ctx = connect()
if ctx == None:
print ("Failed to connect.")
#import sys
sys.exit()
try:
ofile= os.path.abspath('/home/・・・・/graph1.ods')
oURL = unohelper.systemPathToFileUrl(ofile)
smgr = ctx.ServiceManager
desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)
doc = desktop.loadComponentFromURL( oURL,"_blank", 0, () )
except:
pass
Sheet = doc.getSheets().getByIndex(0)
B2=Sheet.getCellRangeByName('B2').Value
C2=Sheet.getCellRangeByName('C2').Value
D2=Sheet.getCellRangeByName('D2').Value
E2=Sheet.getCellRangeByName('E2').Value
F2=Sheet.getCellRangeByName('F2').Value
G2=Sheet.getCellRangeByName('G2').Value
H2=Sheet.getCellRangeByName('H2').Value
B3=Sheet.getCellRangeByName('B3').Value
C3=Sheet.getCellRangeByName('C3').Value
D3=Sheet.getCellRangeByName('D3').Value
E3=Sheet.getCellRangeByName('E3').Value
F3=Sheet.getCellRangeByName('F3').Value
G3=Sheet.getCellRangeByName('G3').Value
H3=Sheet.getCellRangeByName('H3').Value
#xdata = [1880, 1900, 1920, 1940, 1960, 1980, 2000]
xdata = [B2, C2, D2, E2, F2, G2, H2]
# 年: 横軸の値
#ydata = [959596, 2014100, 3699428, 7354971, 9683802, 11618281, 12064101]
ydata = [B3, C3, D3, E3, F3, G3, H3]
# 人口: 縦軸の値
plt.plot(xdata, ydata, color = '#007700', linestyle = 'solid', linewidth = 3)
# 折れ線の描画: 'k-' 黒実線
plt.title('Transition of Population (Tokyo)\n', fontsize = 15)
# グラフのタイトルとフォントサイズ
plt.xlabel('Year')
# 横軸のタイトル
plt.ylabel('Population')
# 縦軸のタイトル
plt.show()
# グラフの表示
LibreOfficeを通信状態で起動してから、graph1A.pyを実行する。
$ ./graph1A.py
折れ線グラフの部分のコードは下記のHPのサンプルをそのまま使用しました。
参考
OOoPython/Automation
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoPython%2FAutomation
折れ線グラフ
http://y-okamoto-psy1949.la.coocan.jp/Python/sampleprgs/DrawGraphs/LineChart/