PyOOCalc-レポートを生成するためのライブラリ、PythonでのLibre / Open Office Calcアカウント

レポートやその他のドキュメントを生成する必要があるときにタスクが発生することがあります。 私の練習では、この問題は複数回発生しています。



このタスクが発生したプロジェクト:





私の最初の経験はMS Officeでしたが、後でクロスプラットフォームソリューションを開発する必要が生じたため、OpenOfficeを選択しました。 なぜなら ほとんどの場合、テーブルを作成する必要があり、OpenOffice Calcが選択されました。



最初は、C ++で同様の問題を解決し、さまざまなプロジェクトで使用するライブラリを開発しました。 すべてが順調でしたが、オフィスのほとんどすべてのマイナーバージョンでライブラリを再構築する必要がありました。 各ディストリビューションとその新しいバージョンについては、せいぜいパッケージを再構築し、オフィスのバージョンを考慮してパスを編集し、OpenOfficeをLibreOfficeに置き換えるなどが必要でした。 そして、それは非常に退屈で時間がかかります。



これらすべての困難により、よりシンプルなソリューションが求められました。 サポートされている言語のリストを見て、Pythonを見ました。 すでにかなり積極的に使用し始めました。 簡単な例を見つけて、試してみました-動作します。 さまざまなバージョンで確認しました-ああ、奇跡です! わずかな編集がなければ、同じスクリプトが異なるディストリビューションとオフィスのバージョンで動作します。



すでに同様のタスクに直面している人-APIを選ぶことはありがたいタスクではないことを知っています。 したがって、最初に既製のライブラリを探し始めました。 私にとって最も興味深いオプションはPyOOでした 。 このライブラリには非常に広範な機能が含まれており、使いやすいです。 ドキュメントの作成/保存からセルの結合やダイアグラムの作成までの機能を実装します。 しかし... ...私が見つけたライブラリはどれも、必要な機能を提供していませんでした。 おいしいが、私には多すぎる。



元のタスクに戻ります。レポートとアカウントを生成する必要があります。 前述のように、テンプレートはオフィススイートで作成するのが最も簡単です。 結局のところ、開発者が参加しなくても、エンドユーザーが作成できます。



テンプレートを作成すると、すべてが明確になりますが、データを貼り付ける場所をどのように知ることができますか。 インデックス(列、行)または名前(例:「E5」)を使用できます。



しかし、1つのレポートでドキュメントを生成するために複数のテンプレートを作成する必要がある場合はどうでしょう。 たとえば、ポートレートレイアウト用のテンプレートとランドスケープ用のテンプレートがあります。 ただし、同じテンプレートに同じセル名(またはインデックス)を使用して同じフィールド(データ)を挿入する必要があるという保証はありません。 これは、テンプレートのフィールドの場所に関するデータを保存する必要があることを意味します。 しかし、よりシンプルな普遍的なソリューションがあります。 このタスクはNamedRangeを介して実装できます。



NamedRangeは、シート上のセルまたは領域の名前です。 この場合、NamedRangeは1本(ドキュメント)のフレーム内で一意です。



この問題を解決するために必要なもう1つの機能は、行の挿入です。 この場合、挿入は文字列の書式(フォント、結合セルなど)を保持する必要があります。



上記のタスクに基づいて、次の機能を実装するモジュールがPythonで開発されました。





使用例:



import pyoocalc # open document doc = pyoocalc.Document() file_name = os.getcwd() + "/example.ods" doc.open_document(file_name) # Get document fields fields = doc.fields() # Get field "HEADER" field = fields.field("HEADER") print ("Document header is: " + str(field.is_null())) # Set values field = fields.field("TABLE_NAME") field.set_value("Test table name") print ("New table name is: " + field.value()) # Insert 5 rows field1 = fields.field("FIELD_1") num_rows = 5 step = 2 if num_rows > 0: field1.insert_rows(num_rows=num_rows-1, step=step, columns_to_copy=200) for i in range(1, num_rows + 1): field1.set_value("F1." + str(i), 0, i * step - (step - 1)) # Set value="value1" at column=1, row=1 (B1) sheet = doc.sheets().sheet(0) sheet.set_cell_value_by_index(1, 0, "value1") print (sheet.cell_value_by_index(1, 0))
      
      





私だけでなく、この問題が発生したと確信しています。 誰かが役に立つと嬉しいです。



これらの要件を備えたサンプルドキュメントとライブラリの使用例は、examplesディレクトリにあります。



ダウンロード: PyOOCalc



All Articles