概要
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