2020年3月22日日曜日

34: 全スプレッドシートをCSVファイル群にLibreOffice UNOで書く

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

あるスプレッドシートドキュメントの全シートを、ただ第1シートだけをでなく。Apache OpenOfficeにも適用可能。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: Javaプログラミング言語
About: C++
About: Microsoft .NET Framework
About: Pythonプログラミング言語
About: LibreOffice Basic
About: Apache OpenOffice Basic
About: BeanShell
About: JavaScript

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、任意の(LibreOfficeまたはApache OpenOfficeによってオープンできる)スプレッドシートドキュメントの全シートをCSVファイル群に読者のプログラムから書く方法を知る。
ト書き
Hypothesizer 7、Objector 34A、Objector 34Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
本記事では、任意の(LibreOfficeまたはApache OpenOfficeによってオープンできる)スプレッドシートドキュメントの全シートをCSVファイル群に私たちのプログラムから書く方法を知ります。

実際には、その知識は、ファイルコンバージョンについての以前の記事(コンセプトあるJava実装あるC++実装 implementationあるC#実装, あるPython実装あるLibreOffice or Apache OpenOffice Basic実装)およびCSVフォーマットを指定することについての以前の記事からほとんど自明ですが、追加の1ヤードの道を行くことにしました。

Objector 34A
正直言って、うざったい説明など欲しくない。そのまま呼べるファンクションが欲しいんだ。

Hypothesizer 7
サー、私は、そういうあらゆるケースにフィットする、ブラックボックスな、このファンクションをそのまま盲目的に使え式のファンクションの信者ではありません。それぞれ独自なニーズがあるかもしれないので、自分で自らのファンクションを作成するのがベストです、私の意見では。したがって、私の意図は、各自が自由に加工できる素材をオファーすることであり、私の説明は、そうした自由な加工を容易にするためのものです。

Objector 34A
退屈な説教はやめろ、そして、お前がファンクションを持っているかどうかを言え!

Hypothesizer 7
えーと、ファンクションを1つ持ってはおります、実のところ、ただ、それがあなたのニーズに間違いなくフィットするという宣言はできません。

Objector 34A
...私のニーズがどんなふうに特別でありうるというのだ、お前のファンクションが私のニーズにフィットしないとは?

Hypothesizer 7
例えば、あなたのニーズは、シート毎に異なったCSVフォーマットを要求するかもしれません。

Objector 34A
ああ、要求しないな、実のところ。

Hypothesizer 7
あなたのニーズは、シート毎に異なったCSVファイルディレクトリを要求するかもしれません。

Objector 34A
しない。

Hypothesizer 7
あなたのニーズは、私のファンクションがサポートしないCSVファイルネーミングルールを要求するかもしれません。

Objector 34A
お前のファンクションはどんなルールをサポートするのだ?

Hypothesizer 7
実のところ、それは、2つのルールをサポートします: 1) 指定されたベース名 + '_' + シートインデックス + '.' + 指定された拡張子 および 2) 指定されたベース名 + '_' + シート名 + '.' + 指定された拡張子。

Objector 34A
例えば?

Hypothesizer 7
指定されたベース名および指定された拡張子がそれぞれ'Abc'および'csv'だった時、それぞれ'Abc_0.csv'、'Abc_1.csv'、...および'Abc_Sheet1.csv'、'Abc_Sheet2.csv'、...、ここで、'Sheet1'および'Sheet2'はシート名です。

Objector 34A
インデックスは'0'から始まらないといけないのか?

Hypothesizer 7
不運なことに、いけません、私のファンクションでは。

Objector 34A
お前、ファンクションを変更して、開始インデックス番号を指定できるようにできるだろ?

Hypothesizer 7
勿論、可能です、しかし、そのような要求はとても多数になる可能性があります: ある方はインデックスを2刻みにしたいかもしれませんし、ある方はインデックスを3桁にしたいかもしれませんし、ある方はインデックスを16進数にしたいかもしれませんし、ある方は指定されたベース名の前または内部にインデックスを入れたいかもしれませんし、ある方は'_'の代わりに'-'にしたいかもしれませんし、...

Objector 34A
実のところ、私は'_'を取り除きたい。

Hypothesizer 7
...したがって、私が思うには、ご自分のニーズにしたがってあなたがご自身のファンクションを作成されるべきです、あなたのニーズにフィットするできあいのファンクションを期待するのでなく。

Objector 34A
誰かが何を望もうがどうでもいい。お前はただ私の望むものを実装すればよいのだ!

ト書き
Hypothesizer 7は、深くため息をつき、首を振る。

Objector 34B
あなたのCSVファイルネーミングルールは私には問題ありません。それであれば、そのファンクションを、あなたのいらだたしい説明を読まずに呼べる?

Hypothesizer 7
...マダム、少なくとも、開発環境を構築し、いくつか準備をされる必要がありますが、それらについての説明(Linux環境を構築するためのものWindows環境を構築するためのもの、LibreOfficeまたはApache OpenOfficeインスタンスへのUNOオブジェクト群コンテキストを外部コンソールJavaC++C#Pythonプログラムにおいて取得するためのもの、LibreOfficeまたはApache OpenOfficeインスタンスをUNOサーバーにするためのものOfficeデーモンを作成するためのものOffice Windowsサービスを作成するためのもの、等)があります。

Objector 34B
...なんで、オペレーティングシステムコマンドとして呼べる実行可能ファイルを提供しないわけ?

Hypothesizer 7
実のところ、私のオファーにそうした実行可能ファイルのソースファイル群(実際には、Java版、C++版、C#版、Python版、LibreOffice Basic版があります)が含まれています、実行可能ファイルはビルドしていただかなければなりませんが(Python版およびLibreOffice Basic版を除き)。しかしながら、いずれにしても、環境といくつかの準備は必要になります。

Objector 34B
...BeanShell版やJavaScript版は紹介されないようね、それらをあなたは話題の一部に誤って挙げてるけど。

Hypothesizer 7
BeanShell版やJavaScript版はここでは紹介されませんが、それらは、本記事に基づいてあなたが実装することができます、それが、BeanShellおよびJavaScriptが本記事の話題から除かれていない理由です。

Objector 34B
...


本体


1: ファイルコンバーターサンプルプログラム群プロジェクトを取得およびビルドする


Hypothesizer 7
ここに、ファイルコンバーターサンプルプログラム群(Java版、C++版、C#版、Python版が含まれています)プロジェクトを格納しているZIPファイルがあります。

一部の版のみをビルドするには、1つのGradleスクリプトを、以前のある記事にしたがって適切に設定するか、不要なソースディレクトリ群を削除してください。

実は、そのプロジェクトは、ファイルコンバージョンについての以前の記事(あるJava実装あるC++実装あるC#実装あるPython実装)にて紹介された(しかし、それ以後変更された)プロジェクトです。

開発環境を構築する方法は、ある以前の記事(Linux用はこちらでWindows用はこちら)に説明されており、本シリーズの任意のサンプルプロジェクトをビルドする方法は、ある以前の記事に記述されています。

実は、LibreOfficeまたはApache OpenOffice Basic版もこちらにあります。

そのZIPファイルはUNO拡張機能を含んでおり、ある以前の記事に記述された指示にしたがってLibreOfficeまたはApache OpenOfficeに登録することができます。

ト書き
Hypothesizer 7は2つのZIPファイルをダウンロードし、それらを展開し、ターミナルを1つオープンし、サンプルプロジェクトをビルドし、UNO拡張機能を登録する。


2: サンプルプログラム群を実行する


Hypothesizer 7
サンプルプログラム群を実行する前に、LibreOfficeまたはApache OpenOfficeのインスタンスを、クライアントからのコネクションを受け付ける状態で開始しておかなければなりません(その方法は、過去の記事で知ることができます)。

ト書き
Hypothesizer 7は、LibreOfficeのインスタンスをポート番号'2002'で開始する。

Hypothesizer 7
コンバージョン指令群CSVファイル(タブ区切りでテキスト項目クウォーテイション無し)を準備します。そのファイルの各行は、1つのスプレッドシートドキュメントをCSVファイル群にコンバートするために以下の項目群を含みます。

コンバート元ファイルのURL
コンバート先ファイルのURL
ドキュメント格納フィルター名: 'Text - txt - csv (StarCalc)' -> CSVファイルへの格納
コンバート元ファイルのオープンパスワード(オプション)
ドキュメントテーラー名(オプション)
全シートが書かれる: 'true' -> 全シートが書かれる、'false' -> 第1シートのみが書かれる(オプションで、デフォルトは'false')
全シートが書かれる際のCSVファイル群ネーミングルール。'0' -> シートインデックス群が使われる、'1' -> シート名群が使われる(オプションで、デフォルトは、'0')
項目群セパレーター文字コード(オプションで、デフォルトは、'44'(コンマ文字を意味する))
テキスト項目クウォーテイション文字コード(オプションで、デフォルトは、'34'(ダブルクウォーテイション文字を意味する))
エンコーディングコード(オプションで、デフォルトは、'76'(UTF-8を意味する))
全テキスト項目がクウォートされる: 'true' -> 全テキスト項目がクウォートされる、'false' -> クウォートしなければならない(項目群セパレーターコードを含んでいるから)テキスト項目のみがクウォートされる(オプションで、デフォルトは、'false')
項目群は表示されたとおりに書かれる: 'true' -> 項目群は表示されたとおりに書かれる、'false' -> 項目群は特定の固定されたフォーマットで書かれる(オプションで、デフォルトは、'false')
フォーミュラ自体が書かれる: 'true' -> フォーミュラ自体が書かれる、'false' -> フォーミュラの値が書かれる(オプションで、デフォルトは、'false')
隠されたシート群が書かれる: 'true' -> 隠されたシート群が書かれる、'false' -> 隠されたシート群は書かれない(オプションで、デフォルトは、'false')

Objector 34B
「オプション」っていうのは...

Hypothesizer 7
それは、 その項目自体と引き続く項目群全てを省略するか、その項目を空値にするかできることを意味します。

Objector 34B
中間のある1項目だけを省略するなんてできないんでしょうね、もちろん?

Hypothesizer 7
できません、勿論、CSVファイルの性質上: もしも、ある項目を省略するのであれば、引き続く全ての項目を省略しなければならないでしょう、ある項目を空値ににして引き続く項目を持つことはできますが。

Objector 34B
ああ、もちろん。

Hypothesizer 7
実は、サンプルのコンバージョン指令群CSVファイルが、各ZIPファイルに'filesConverter/execution/ConversionOrders.csv'として入っています。

各版を実行する方法は、以前の記事(あるJava実装あるC++実装あるC#実装あるPython実装あるLibreOfficeまたはApache OpenOffice Basic実装)に記述されています。

ト書き
Hypothesizer 7は、ターミナルで、カレントディレクトリをサンプルプロジェクトディレクトリに位置させて、各版を実行する。

Objector 34B
あのねえ、Gradleを呼ぶのは大きなオーバーヘッドがあるのよね。Gradleを介さずにプログラムを呼ぶにはどうしたらいいの?

Hypothesizer 7
Gradleを呼び出したら、それが実行したコマンド群が表示されるはずです。その最後のコマンドを見てください、それがあなたが用いるべきものです(表示されたものにいくらか調整をしなければならないことにはご注意ください、いくつかのダブルクウォーテイションマークはそこに表示されませんので)。

Objector 34B
...えーと、いくつか環境変数をセットしているようね、プログラムを実行する前に。

Hypothesizer 7
はい、それが重要なところです。


3: サンプルプログラムを理解する



3-1: プロジェクト群構造またはBasicライブラリ群構造


Hypothesizer 7
プロジェクト群構造またはBasicライブラリ群構造については、以前の記事(あるJava実装あるC++実装あるC#実装あるPython実装あるLibreOfficeまたはApache OpenOffice Basic実装)の記述をご参照ください。


3-2: 全シートの内の各々をCSVファイルにコンバートするメソッド


Hypothesizer 7
'theBiasPlanet.unoUtilities.filesConverting.FilesConverter.convertSpreadSheetsDocumentFileToCsvFiles'(または、プログラミング言語に応じたその同等物)メソッドが、問題の、全シートの内の各々をCSVファイルにコンバートするファンクションです。

そのメソッドは、以下の引数を取ります: コンバート元ファイルURL、コンバート元ファイルパスワード、コンバート先ファイルのURLベース('file:///home/${HOME}/myData/development/filesConverter/execution/FilesConverterTestConvertedTo.csv'のような値が、'file:///home/${HOME}/myData/development/filesConverter/execution/FilesConverterTestConvertedTo_0.csv'のようなコンバート先ファイルURL群になります)、ドキュメント格納プロパティ群、ドキュメントテーラー、コンバート先ファイル群ネーミングルールコード、隠されたシート群が書かれるか否か。

そのメソッドは十分に明快だと考えますが、いくつか注釈をします。

シート群は、「for」ループ内で1つずつアクセスされており、一部のシートをなんらかの基準によってスキップしたいのであれば、対応するループ回にて'storeToURL'呼び出しをスキップすればよいだけです。

各ループ回のためのCSVファイルURLは、'l_augmentedTargetFileUrl'変数にセットされており、ご自身のファイルネーミングルールにしたいのであれば、その変数をセットするロジックを調整すればよいだけです。

ある以前の記事(あるJava実装、等)では、特定のシートをCSVファイルに書くために、あるドキュメントテーラーを用いましたが、そのドキュメントテーラーは、その目的で本メソッドのために使用する必要がありません(当然ですが)。本メソッドのためのドキュメントテーラーは、別の目的のためのものです。


3-3: CSVファイルへ格納するためのプロパティ群を作成するメソッド


Hypothesizer 7
'theBiasPlanet.unoUtilities.filesConverting.FilesConverter.createCsvFileStoringPropertiesArray'(または、プログラミング言語に応じたその同等物)というメソッドは、CSVファイルへ格納するためのプロパティ群の配列またはリストを、指定されたCSVフォーマット属性群(項目群セパレーター文字、等)から作成するスタティックメソッドです。


4: 結びとその先


Hypothesizer 7
これで、私たちは、任意の(LibreOfficeまたはApache OpenOfficeによってオープンできる)スプレッドシートドキュメントの全シートをCSVファイル群に私たちのプログラムから書く方法を知りました。

一部のシートをスキップしたり、独自のCSVファイルネーミングルールを採択したりしたいのであれば、紹介されたファンクションを変更することでそうできます。

スプレッドシートドキュメントをCSVファイル群へ書き込む前にそれに手を加えたいのであれば、ドキュメントテーラーを指定することでそうできます。

そうした事が自由にできるのは、ファイルをコンバートするのにUNO APIを直接に使用しているためです


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>