web-dev-qa-db-ja.com

LibreOffice Calcセルで数式としてPython関数を使用する

LibreOffice Calcはマクロをサポートしており、組み込み関数は多少制限されているため、Pythonで独自の関数を記述し、それらを個々のセルの数式として使用したいと思います。理想的には、 Pythonファイルのような:

_def VOL(a, b, c):
    v = a*b*c
    return v
_

ドキュメントに埋め込まれるか、または単純な場所に_custom_functions.py_ファイルとして。そうすれば、セルに=VOL(A1, A2, B3)を記述して、結果を計算させることができます。不正な入力やその他のエラーは、組み込みの計算関数が行うのと同じように、セルにエラーテキストを生成するはずです。

[ツール]> [マクロ]> [マクロの整理...]> [LibreOfficeBasic]に移動できます。これにより、上記で説明した方法で新しい関数を作成できるダイアログが表示されます(テストは行っていません)。残念ながら、これにはPythonではなくBasicで記述する必要があるようです。このためだけにBasicを学びたくはありません。Pythonでの知識と経験を活用したいと思います。

[ツール]> [マクロ]> [マクロの整理...]> [Python]に移動すると、新しいマクロを作成するためのオプションがグレー表示されます。インターネットで少し掘り下げた後、どうやらLibreOffice(実際にはアップストリームのOpenOffice)には独自のPython IDE "yet"、プレースホルダーとしての説明なしで、UIにグレー表示されたボタンを配置するだけです。2012年にこれについて不満を訴えている人々が今すぐ修正されると言われただけなので、「まだ」と言います。

また、ある種のPython相互運用ライブラリを使用したPython拡張機能の記述に関する情報も見つかりました。これには、最も基本的なライブラリでさえ、大量のライブラリをインポートする必要があるようです。例には数十行の複雑なボイラープレートコードが必要であり、デバッグはおそらく苦痛です。通常のPythonスクリプトをスプレッドシートから読み取り、それを書き戻すだけのスクリプトを書く方がはるかに簡単です。ただし、必要な関数は比較的些細なものであり、データを効果的に表示およびナビゲートできることは、探索的分析を開発およびデバッグするのに非常に役立つため、関数を単純に定義することができますPython and play Calcスプレッドシート内にそれを含めると非常に便利です。これを行う方法はありますか?

私はLibreOffice 5.2.2.2とWindows 7を使用しています。Python 2または3のいずれかを使用できますが、3を優先します。

3
Superbest

あなたが尋ねたいくつかの事柄は簡単に解決されますが、他の事柄はそれほど解決されません。まず、IDE。 [〜#〜] apso [〜#〜] は、すぐに使用できる拡張機能であり、編集に便利なメニューを提供しますPythonマクロ。

インストールしたら、ツール->マクロ->整理pythonスクリプトに移動します。展開My MacrosそしてMenu-> Create moduleに移動します。名前を「custom_functions.py」にします。

次に、ファイルを選択して、メニュー->編集に移動します。これを機能させるには、ツール->拡張機能マネージャーに移動し、APSOにお気に入りのテキストエディターへのパスを指示する必要があります。鉱山はC:\Program Files (x86)\Vim\vim80\gvim.exeに設定されています。

テキストエディタで、次のコードを入力します。

def VOL(a, b, c):
    v = a*b*c
    return v

def call_vol():
    oSheet = XSCRIPTCONTEXT.getDocument().getSheets().getByIndex(0)
    cell_a = oSheet.getCellRangeByName("A1")
    cell_b = oSheet.getCellRangeByName("A2")
    cell_c = oSheet.getCellRangeByName("A3")
    cell_result = oSheet.getCellRangeByName("B1")
    cell_result.setValue(
        VOL(
            cell_a.getValue(),
            cell_b.getValue(),
            cell_c.getValue()))

g_exportedScripts = call_vol,

コードを実行するには、APSOを再度使用するか、組み込みツール->マクロ->マクロの実行に移動して、call_vol関数を検索して実行します。たとえば、A1からA3にそれぞれ2が含まれている場合、2 * 2 * 2 = 8であるため、B1に8が生成されます。

では、このマクロをスプレッドシート関数に変換するにはどうすればよいでしょうか。適切な方法は spreadsheet add-in を作成することです。このような関数はうまく機能することがわかりましたが、いくつかのXML構成ファイルが必要であり、これを避けたいようです。

アドインを作成する代わりに、 ユーザー定義関数 を使用できます。これらは、Basicで記述されている場合にのみ呼び出すことができます。

コア作業がPythonで行われるUDFの場合、スクリプトプロバイダーを使用して calls Python from Basic というラッパー関数をBasicに配置します。

Windowsでは、LibreOfficeの最近のバージョンには通常Python 3が付属しています。ApacheOpenOfficeにはPython 2が付属しています。

2
Jim K