LoginSignup
2
4

More than 5 years have passed since last update.

UbuntuのPython3からLibreOfficeを操作する

Last updated at Posted at 2018-03-17
実行した環境

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"
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を実行する。

$ ./graph1A.py

fuyou.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/

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4