LibreOffice Calcで範囲指定で値を取得する

プログラミング

概要

PythonでCalcの範囲を指定してセルの値を取得する方法について説明します。
ScriptForgeを使えば特に難しいことはありません。
今回は、例として指定した範囲のセルの値の合計を返す関数
py_sum(cell_range) と py_sum_2(cell_range)
について説明します。

Basicを利用する方法


    # coding: utf-8
    from __future__ import unicode_literals
    
    def py_sum(range_address):
        # ScriptForge.Basicサービスを作成
        basic = CreateScriptService("Basic")
        
        # 現在のドキュメントを取得
        doc = basic.ThisComponent
        
        # シートを取得(現在のアクティブシート)
        sheet = doc.CurrentController.ActiveSheet
        
        # 指定された範囲を取得
        cell_range = sheet.getCellRangeByName(range_address)
        
        # 範囲内のセルの値を合計する
        total_sum = 0
        for row in range(cell_range.Rows.Count):
            for col in range(cell_range.Columns.Count):
                cell = cell_range.getCellByPosition(col, row)
                total_sum += cell.Value
        
        return int(total_sum)
        
    g_exportedScripts = (py_sum,)
 

 

こちらは、Basicサービスを使っています。
sheet.getCellRangeByName(range_address)で指定された範囲のセルのオブジェクトを取得しています。
その後、getCellByPosition(col, row)でセルのオブジェクトを取得し、Valueでセルの値を取得しています。
その合計を返しています。

ScriptForgeを利用する方法


    # coding: utf-8
    from __future__ import unicode_literals
    from scriptforge import CreateScriptService

    def py_sum_2(range_address):
        # Calcサービスのインスタンスを作成
        doc = CreateScriptService("Calc")
        
        # 指定範囲の値を取得
        values = doc.GetValue(range_address)
    
        sum_value = 0
        for row in values:
            sum_value += sum(row)
            
        return int(sum_value)
        
    g_exportedScripts = (py_sum_2,)

 

こちらは、ScriptForgeを使っています。
サービスを作って、GetValueで指定された範囲の値を取得しているだけです。
doc.GetValue(range_address)で指定された範囲の値を取得していますが、2次元のタプルが返ってきます。
タプルの中身は、行ごとにセルの値が入っています。

セルの値について

Calcは、セルの値をfloatで返します。
セル内の値が (1,2,3)等の数値であっても、単純に合計するとfloatで6.0と返ってきます。
ドキュメントの記述は、見つからなかったのですが内部的にはfloatで扱っているようです。
ですので、intで整数に変換しています。

範囲指定の書き方

“Sheet1″の[A1:C3]の合計を求める場合


py_sum("Sheet1.A1:C3")

などと指定します。

まとめ

Calcの範囲指定は、ScriptForgeを使うと簡単にできます。
Basicを使う場合は、セルのオブジェクトを取得して、その値を取得する必要があります。
数値は、floatで返ってくるので、必要であればintに変換してください。

Commnts