UbuntuのPython3からLibreOfficeを操作する

#####実行した環境
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を通信状態で起動
パスは環境に合わせ変更してください。

```python:
$ /opt/libreoffice6.0/program/soffice "-accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"
```

```python:graph1A.py
#!/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を実行する。

```python:
$ ./graph1A.py
```


![fuyou.png](https://qiita-image-store.s3.amazonaws.com/0/238800/010105af-8e77-e0d2-f826-e577944b2ae0.png)

折れ線グラフの部分のコードは下記のHPのサンプルをそのまま使用しました。


参考
OOoPython/Automation
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoPython%2FAutomation

折れ線グラフ
http://y-okamoto-psy1949.la.coocan.jp/Python/sampleprgs/DrawGraphs/LineChart/