2018年4月1日日曜日

1: LibreOfficeまたはOpenOffice、Java、C++、C#、VB.NET、Python、JavaScript、等を使って

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

UNOを介して、Microsoft COMではなく。内側(マクロ)から、または外側(外部プログラム)から。GUIまたはキーバインディングを増強する。'soffice'をコールする?

話題


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

この記事の目次


開始コンテキスト


  • 読者は、コンピューターについての基本的な知識を持っている(ファイル、プログラム、プロセスなどが何かを知っている)。
  • 読者は、オフィススイート(コンピューターのソフトウェアとしての)についての基本的な知識を持っている(ワードプロセッサー、スプレッドシートなどが何か、それらが一般的に持っている機能が何か、マクロが何か(この知識は、マクロにかかわる記述を読みとばすのであれば必ずしも不可欠ではない)を知っている)。
  • 読者は、'話題'に挙げられているプログラミング言語の内の少なくとも1つの知識(または、学ぼうという意思)を持っている。

ターゲットコンテキスト



  • 読者は、UNOを通してLibreOfficeまたはApache OpenOfficeを活用することが自分に合っているかどうかを知る。
ト書き
Hypothesizer 7、Objector 1A、Objector 1B、objector 1Cがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
この記事は、UNOが自分が学ぶべきものであるかどうかを読者が判断できるようにするためのものです。

Objector 1A
UNOだと?そんなものに興味などない。俺がここに来たのはそこの要約を見たからであって、何か知らんがUNOなどというものを学びたかったからじゃない。

Hypothesizer 7
あの、UNOを使うというのが、要約が尋ねていることを達成するために私が紹介する方法なのですが。

Objector 1A
だがUNOだって?響きが、俺に関係ありそうじゃ全くない。

Hypothesizer 7
・・・響き方で物事を判断するのは賢明ではないかもしれません。

Objector 1A
だが、そんなの聞いたこともない。

Hypothesizer 7
あの、お聞きになったことがないものがすべてお役に立たないわけではないかと存じます。

Objector 1A
まあ、・・・そうだが、聞いたことがないものすべてを学ぶわけにもいかん。

Hypothesizer 7
ごもっともです。何かを学び始める前に、それが学ぶに値するかどうかを判断なさる必要があるでしょう。そこで、UNOをマスターした後に何ができるかをご紹介するこの記事が必要だろうと私は考えたわけです。

Objector 1B
要約が尋ねていることが、私がUNOをマスターした後にできることだと、あなたは言っているんじゃないの?

Hypothesizer 7
マダム、基本的にはそうです。

Objector 1B
では、私が何ができるようになるか私は既に知っているわけでしょう。なんで、この記事を読まないといけないわけ?

Hypothesizer 7
要約で既にご満足でしたら、その必要はございません。UNOは、次の記事から学び始めます、もしも、ご興味をお持ちでしたらですが。・・・私は、もっと詳細な説明が必要だろうと思ったわけです。「どんなフォーマットのファイル?どんなプログラム?いろいろって何?'マクロの外'ってどういう意味?」

Objector 1B
もちろん、満足してません。私を容易に満足させられると思ったら、あなた、大間違いですよ。

Hypothesizer 7
・・・はい、マダム。

Objector 1A
それで、このオリエンテーションなるナンセンスはいつ終わるんだ?本体はどこにある?

Hypothesizer 7
ここにございます。

ト書き
Objector 1AとObjector1 Bは、本体へとぶ。

Objector 1C
あんたの'ターゲットコンテキスト'はLibreOfficeとApache OpenOfficeに触れとる。これらはフリーのオフィススイートだろう?

Hypothesizer 7
それらは、無償で使えるオープンソースオフィススイートでございます。

Objector 1C
「オープンソース」?

Hypothesizer 7
それが何かは、ここに説明がございます。

Objector 1C
ふむ?とにかく、俺はそんなの使ってないんだよ。Microsoft Officeを使ってるんだ。

Hypothesizer 7
それは、全く問題ないかと思います。それらを使ったからといって、Microsoft Officeを使い続けることに何ら支障はございません。

Objector 1C
何が俺にとって問題かは俺が決めることだ!

Hypothesizer 7
・・・申し訳ございません。

Objector 1C
フリーソフトは安全じゃないと思うぞ。

Hypothesizer 7
・・・それらは、ただのフリーソフトではなく、アクティブに開発されているオープンソースソフトウェアでして、そこが重要なのです。

Objector 1C
どう重要なんだ?

Hypothesizer 7
ソースファイルが公開されているので、意図的に有害なコードは含められません、商用ソフトウェアではあなたのプライバシーを密かに犯すことができてしまいますが。それに、バグは多くの人々によってアクティブに修正されています。

Objector 1C
ソースファイルが公開されているから、脆弱性がアタッカーに簡単に見つけられてしまうだろうが?

Hypothesizer 7
そういう側面はあるかもしれませんが、大勢いるディフェンダーも脆弱性を見つけて修正できますから、通常、オープンソースソフトウェアは商用ソフトウェアよりも安全ではないとは考えられていません、それは、アクティブに開発されているということが前提ですが。実際、今や、多くの広く欠かせないソフトウェアがオープンソースです。

Objector 1C
・・・それが真実かどうかは別にして、オープンソースソフトウェアを使って損害を受けても誰も責任を取らんだろう。

Hypothesizer 7
あなたが責任を取るのです。それについて言えば、商用ソフトウェアを使ってあなたが受けた損害に、ベンダーが何か意味のある責任を取るとも思えませんね、少なくともほとんどの場合。実際、あなたが失なったデータやプライバシーについて、ベンダーが何をしてくれるでしょうか?

Objector 1C
・・・俺は、Microsoft Officeフォーマットのファイルを読み書きしなくちゃならんのだ。

Hypothesizer 7
できます、ありえるファイルすべてを完璧にとはいきませんが。

Objector 1C
それが問題だろうが?

Hypothesizer 7
・・・あなたにとって何が問題かはあなたが決めるのだということは承知しております、しかし、私にとっては、私自身のファイルが問題なく読み書きできれば、何ら問題ではございません。

Objector 1C
・・・俺のファイルが問題なく読み書きできるか、どうすれば分かるんだ?

Hypothesizer 7
うーん、これはオリエンテーションにすぎませんので、そこまで深くここで立ち入ることはできません。そうしたことは、本体で取り扱われます、もし、ご興味がおありでしたら。

ト書き
Objector 1CはHypothesizer 7をにらみつける。

Objector 1C
俺の質問に答えられんというのか?

Hypothesizer 7
・・・そうではございません。適切な順序を踏んで説明をさせていただければ、ご質問に適切にお答えできるでしょうと申し上げたのでございます。

ト書き
Objector 1Cは、憤然と足を踏み鳴らしてどこかに去っていき、Hypothesizer 7はため息をつく。


本体


1: UNOを通してLibreOfficeまたはApache OpenOfficeを使って何ができるか?


Hypothesizer 7
ここでは、UNOを通してLibreOfficeまたはApache OpenOffice(これらは、オープンソースのオフィススイートです)を使って何ができるかを学びます。UNOが何かは、次の記事で学びます。これは、それを学び始める前に、あなたには、それが自分にとって学ぶ価値ありであるかどうかを判断する必要があるだろうからです。

Objector 1A
「通して」に「使って」?違いが分からん。

Hypothesizer 7
ごもっともです。UNO、LibreOffice、Apache OpenOfficeのそれぞれの間の関係については、次の記事で詳細に学びますが、ここでも簡潔な説明が必要です。

UNOは、1群の仕様であり、LibreOfficeおよびApache OpenOfficeは、それぞれ、UNOを実装した上で自らのUNO実装を使ったアプリケーションです。

Objector 1A
ああ。すると、具象のソフトウェアではないUNOを直に使うわけにはいかず、LibreOfficeまたはApache OpenOfficeを使うのだと・・・

Hypothesizer 7
そして、LibreOfficeまたはApache OpenOfficeを使う際 、UNOが、我々のプログラムとLibreOfficeまたはApache OpenOfficeの間のインターフェース標準となります。


1-1: さまざまなプログラミング言語からさまざまなドキュメントファイルを読み書きできる


Hypothesizer 7
UNOを通してLibreOfficeまたはApache OpenOfficeを使えば、さまざまなプログラミング言語からさまざまなドキュメントファイルを読み書きできます。

Objector 1C
さまざまなドキュメントファイルというのは、どんなファイルだ?

Hypothesizer 7
ああ、ここにいたのですか・・・

Objector 1C
悪いか?

Hypothesizer 7
もちろん、そのようなことはございません。実は、LibreOfficeとApache OpenOfficeのいずれを使うかによって違い、読めるものが必ずしも書けるものではなく、逆も同じです。

Objector 1C
それで?

Hypothesizer 7
LibreOfficeでは、全てのOpenDocumentフォーマットファイル、全てのOffice Open XMLフォーマット(Office Open XMLフォーマットは、Microsoft Office 2007でデフォルトファイルフォーマットとして採用されたファイルフォーマットとほとんど同じものです)ファイル、少なくともほとんどのMicrosoft Office(商用のオフィススイート)ドキュメントフォーマットファイル、CSVフォーマットファイル、その他を読み書きできます。

Objector 1C
「Microsoft Office 2007でデフォルトファイルフォーマットとして採用されたファイルフォーマットとほとんど同じもの」?なんで、そんな悪意に満ちた、回りくどい言い方をする?

Hypothesizer 7
・・・悪意はありません。ただ正確であろうとしているだけでして、それは私の第一行動規範です。Microsoft Office 2007のデフォルトファイルフォーマットは、厳密にはOffice Open XMLに準拠しておらず、そのため「ほとんど」を付けざるを得ないわけです。

Objector 1C
状況がよく分からんな。・・・Office Open XMLという仕様は、Microsoftが提案したのに、Microsoftによって守られなかったのか?

Hypothesizer 7
正直なところ、私にも状況がよく分かりません。

とにかく、Apache OpenOfficeでは、主な相違として、Office Open XMLフォーマットのファイルやそれに近親のMicrosoft Officeフォーマットのファイルを書けません。

Objector 1C
「それに近親のMicrosoft Officeフォーマットのファイル」というのは、Office Open XMLフォーマットのファイルに似ているが厳密にはそうでないMicrosoft Officeフォーマットのファイルのことらしいな・・・

Hypothesizer 7
そうです。読めるファイルフォーマットの正確な一覧と書けるファイルフォーマットの正確な一覧をお知りになりたければ、LibreOfficeまたはApache OpenOfficeのGUI上で見ることができます。

Objector 1C
どうやって?

Hypothesizer 7
読めるファイルフォーマットの一覧を見るには、LibreOfficeまたはApache OpenOfficeで、ファイルを開くダイアログウィンドウを開き、あるコンボボックス内のファイルフォーマットを見ます。

ト書き
Hypothesizer 7は、コンピュータースクリーン上でLibreOfficeのプロセスを起動し、メニュー上で'File(ファイル)' -> 'Open...(開く...)'をクリックして、ファイルを開くダイアログウィンドウを開き、コンボボックス(ウィンドウが開いた際に'All files(すべてのファイル)'となっているもの)の内容を見せる。

Objector 1C
ふーん、少なくとも、Microsoft Wordの'doc'と'docx'、Excel の'xls'と'xlsx'、PowerPointの'ppt'と'pptx'のファイルは読めるわけだ・・・

Hypothesizer 7
書けるファイルフォーマットの一覧は、ドキュメントタイプ(スプレッドシートドキュメント、ワードプロセッサードキュメント等)毎に見なければなりません。LibreOfficeまたはApache OpenOfficeで、各ドキュメントタイプの新規ドキュメントを作成し、ファイルを保存するダイアログウィンドウを開き、あるコンボボックス内のファイルフォーマットを見ます。

ト書き
Hypothesizer 7は、新規スプレッドシートドキュメントを作成し、メニュー上で'File(ファイル)' -> 'Save As...(名前を付けて保存...)'をクリックして、ファイルを保存するダイアログウィンドウを開き、コンボボックス(ウィンドウが開いた際に'All Formats(すべての形式)'となっているもの)の内容を見せる。

Objector 1C
PDFフォーマットが見当たらない。PDFファイルは書けないのか?

Hypothesizer 7
書けます。PDFフォーマットのファイルは、別のメニュー項目で保存するようになっています。これは、たぶん、PDF固有のパラメータ群を指定できるようにするためでしょう。

Objector 1C
ああ、それで、LibreOfficeが俺のMicrosoft Officeフォーマットファイルを問題なく読み書きできるかをどうすれば知ることができるんだ(LibreOfficeはありうるMicrosoft Officeファイルすべてを完璧に読み書きできるわけではないと、'オリエンテーション'であんた言っただろう)?

Hypothesizer 7
LibreOfficeであなたのドキュメントファイルを読み込み・保存してみればよいのです。それがもっとも確かな方法だと思います。

Objector 1C
うーん、何か混同している気がする。あんたは、LibreOfficeが何を読み書きできるかを話している。俺は、俺のプログラムが何を読み書きできるかを気にしているんだ。

Hypothesizer 7
ああ、それはいい指摘です。ですが、実はそこに混同はないのです。あなたのプログラムは、ファイルを読む時、ファイルを直接自分で読むのではなく、LibreOfficeまたはApache OpenOfficeのプロセスにファイルを読み込ませ、そのLibreOfficeまたはApache OpenOfficeのプロセスから内容を取り出します。あなたのプログラムは、ファイルを書く時、LibreOfficeまたはApache OpenOfficeのプロセスに管理されているドキュメントに内容を入れ込み、そのLibreOfficeまたはApache OpenOfficeのプロセスにそのドキュメントを保存させます。

Objector 1C
ふーむ。・・・さまざまなプログラミング言語がどうだとか、あんた言ったな。

Hypothesizer 7
はい。

Objector 1C
どんなプログラミング言語なんだ?

Hypothesizer 7
私が知る限りでは、Java、C++、Microsoft .NET Framework(Microsoft .NET Coreは不可です)(Windowsでだけです。Monoを使用しても他のOSでは不可です) 、Python、LibreOffice BasicまたはApache OpenOffice Basic、BeanShell、JavaScriptです。ただし、これらのプログラミング言語のすべてでUNOのフル機能が使えるわけではありません。

Objector 1C
どういう意味だ?

Hypothesizer 7
うーん、これは私もまだ完全には把握していないことなのですが・・・例えば、私のMicrosoft .NET Frameworkプログラムに、ローカルのLibreOfficeプロセス(私のプログラムが動作するコンピューターで動作するLibreOfficeプロセスのこと)を操作させることはできますが、私のMicrosoft .NET Frameworkプログラムに、リモートのLibreOfficeプロセス(私のプログラムが動作するコンピューターで動作していないLibreOfficeプロセスのこと)を操作させることにはまだ成功していません(後記:後に、これに成功した。しかし、まだ問題はある。)。また、Python、LibreOffice Basic Basic、BeanShell、JavaScriptについて、LibreOfficeに含まれたそれぞれのランタイムでUNOの一部の機能を使えることは知っていますが、そうした機能を外部のランタイムに入れ込めるかは知りません。他方で、JavaおよびC++でUNOのフル機能が使えることは知っています。

Objector 1C
実は、俺はC#プログラマーなんだ。

Hypothesizer 7
ああ、ローカルでのLibreOfficeプロセス操作でご満足でしたら、何も問題はないはずです(後記:後に、リモートでのLibreOfficeプロセス操作もできることを発見したが、まだ1つ問題を解決していない)・・・が、もちろん、あなたにとって何が問題かはあなたがお決めになることです・・・

Objector 1C
別に満足しとらんが、当面は我慢できるだろう。

Hypothesizer 7
ところで、ファイルを別のファイルフォーマットにコンバートしたい場合、それは、LibreOfficeまたはApache OpenOfficeのプロセスにファイルを読み込ませ、その読み込まれたドキュメントを、そのプロセスに、ご希望のファイルフォーマットで保存させるだけのことです。

Objector 1C
論理的に言って、そういうことになるだろうが・・・、そうしたコンバージョンを行なう'unoconv'というツールがあると聞いたんだが・・・

Hypothesizer 7
それは、基本的には、私が申し上げたことを行なっているだけです。

Objector 1C
unoconvで出来るのに、自分でコンバージョンを行なう必要性があるのか?

Hypothesizer 7
unoconvでは出来ない事があります、私の知る限りでは。例えば、PDFに署名することやカスタマイズした'スタイルの置換'は出来ないように思われます。

Objector 1C
「カスタマイズした'スタイルの置換'」とはどういう意味だ?

Hypothesizer 7
あなたのドキュメントファイル内のスタイルを、指定したテンプレートファイル内の対応するスタイル(スタイル名にしたがって)で置換することはできます。しかし、すべてのスタイル(スタイル名にかかわらず)を単一のスタイルで置換したいことがあるかもしれません。

Objector 1C
そんなことは全然したくないなあ。

Hypothesizer 7
・・・したくなければそれで全然かまいません。unoconvができることだけをする新たなプログラムを作る必要があるとは言っておらず、ドキュメントファイルを読み書きするUNOプログラムを作っているのであれば、コンバージョンを行なうために外部ツールをインストールして外部プロセスとして呼ぶ必要はないと言っているのです。

Objector 1C
ああ、それはそうだ。


1-2: 実のところ、自分のプログラムからLibreOfficeまたはApache OpenOfficeのプロセスをさまざまに操ることができる


Objector 1A
俺のプログラムはファイルを直接読むわけではなく、LibreOfficeまたはApache OpenOfficeのプロセスにファイルを読み込ませるのだとあんた言ったな、俺が誤解していなければ。

Hypothesizer 7
全く誤解なさっていません。

Objector 1A
俺のプログラムはLibreOfficeまたはApache OpenOfficeのプロセスに他の事もさせられるのか?

Hypothesizer 7
はい、できます。ドキュメントファイルを読み書きすることについて話したのは、それが最も一般的な関心事だろうと推測したからであって、実は、その要諦は、自分のプログラムからLibreOfficeまたはApache OpenOfficeのプロセスを操るということであって、ドキュメントファイルを読み書きするというのは、そうした操作の1例にすぎません。

Objector 1A
俺のプログラムは、LibreOfficeまたはApache OpenOfficeのプロセスに、LibreOfficeまたはApache OpenOfficeができることを何でもさせられるのか?

Hypothesizer 7
それは保証されていませんが、あなたのプログラムはLibreOfficeまたはApache OpenOfficeのプロセスに、多くの典型的なことをさせることができます。

Objector 1A
何ができて何ができないかは、どうすれば分かるんだ?

Hypothesizer 7
実のところ、それを教えてくれる一覧表はありません。今、私に言えるのは、UNOの使い方(今後の記事で学びます)をマスターしたら、そのようにしてアクセスできるものが、できること、それ以外が、できないことだということです。


1-3: LibreOfficeまたはApache OpenOfficeの中で、Basicのマクロを書くよりも、もっとさまざまなことができる


Hypothesizer 7
LibreOfficeまたはApache OpenOfficeの中に機能を追加する(これを、私たちは通常、'LibreOfficeまたはApache OpenOfficeを拡張する'と呼びます)ことができます。

Objector 1B
・・・「LibreOfficeまたはApache OpenOfficeの中に機能を追加する」という意味が分からないわ。何かのメニュー項目かボタンがLibreOfficeかApache OpenOfficeのGUIに追加されるわけ?

Hypothesizer 7
必ずしもそうではありません、そういうこともありえますが。

Objector 1B
それでは、必ずしも、何が起きるわけ?

Hypothesizer 7
何らかのプログラム要素が追加されます。

Objector 1B
分からないわ・・・

Hypothesizer 7
例えば、Basicのマクロはプログラム要素です。

Objector 1B
Basicのマクロなら私も書くけど。

Hypothesizer 7
それではご存知でしょう、Basicのマクロを書いても、それだけで、メニュー項目かボタンが追加されるわけではありません。

Objector 1B
でも、マクロを実行するボタンを私は追加するけど。

Hypothesizer 7
そうすることはできます、しかし、そうしなければいけないわけではありません。マクロは、Basicエディターから実行することもできます。

Objector 1B
それはそうだけど・・・、Basicコード(これがBasicマクロを作るわけでしょう)を追加することについては、あなたもう、上のサブセクションで話したでしょう?

Hypothesizer 7
はい、話しました。しかし、このサブセクションの必要性を問うていらっしゃるのであれば、上の2サブセクションは、自分のプログラム(それは、たまたま、'LibreOfficeまたはApache OpenOfficeの中に追加された機能'であることもないこともあります)からLibreOfficeまたはApache OpenOfficeのプロセスを操ることについてであって、LibreOfficeまたはApache OpenOfficeの中に機能を追加することについてではありませんでした。

Objector 1B
どちらにしろ、マクロを追加するというのが改めて言うべきことだとも思えないけど・・・

Hypothesizer 7
プログラム要素は、Basicマクロである必要はありません。LibreOfficeまたはApache OpenOfficeの中には、Java、C++、Python、BeanShell、JavaScriptのコードも追加できます。

Objector 1A
'LibreOfficeの中にJavaコードを追加する'のは、'LibreOfficeを操る外部Javaプログラムを作る'のとどう違うんだ?

Hypothesizer 7
LibreOfficeの中に追加されたJavaコードは、マクロ、スプレッドシートセル関数、コンテキストメニュー等から直接呼び出すことができます。

Objector 1A
LibreOfficeの中に追加されたJavaコード'は、スプレッドシート上のボタンから直接呼び出すことはできないのか?

Hypothesizer 7
私が知る限りではできません、しかし、Javaコードを呼び出すための最小限のマクロコードが必要なだけであって、それ以外はJavaコードにすることができます。

Objector 1A
おお、それはいい。正直なところ、LibreOffice Basicには満足していない。機能は限られているし、本格的なオブジェクト指向プログラミング言語ではないし、さらには、ドキュメントが貧弱だ。

Objector 1B
最後の部分には賛成と言うよりほかにないわ・・・

Objector 1A
Basicで、どうやって、ネットワーク機能(ウェブページ、ウェブサービス、クラウド等にアクセスする)を実装したり、SwingやJavaFXのGUIに匹敵するようなリッチなGUIを実装したり、さまざまなタイプのデータ(XML、Json等)を操作したり、マルチスレッドでロジックを実装したり、OSレベルの機能にアクセスしたりすればいい?

Hypothesizer 7
Basicでそれらをどうやって、もしくはそもそもできるのか私は知りませんが、Javaでは、それらは標準手続きです。

Objector 1A
Javaを使えば、何でも実装できるのか?

Hypothesizer 7
Javaが実装できるものは何でも実装できます、・・・基本的には。

Objector 1A
「基本的には」?

Hypothesizer 7
注意点としては、あなたのコードは、LibreOfficeが用意したJVM('JVM'はJavaのランタイムです)で動作します。

Objector 1A
だから?

Hypothesizer 7
それについて私が知っている1つの問題は、そのJVMでJavaFXを動かせないことです。これは、JavaFXプログラムは、それ自身用の新たなJVMで動作するように想定されている(JavaFXプログラムは、'main'関数で'Application.launch'を呼ぶように想定されている)からです。

Objector 1A
ああ、それでは、JavaFXは全然使えないのか?

Hypothesizer 7
方法はあります。これは、UNOサーバー(同時にクライアントにもなります)を、外部JavaFXプログラムとして作り、そのコードをLibreOfficeの中に追加されたJavaコードから呼び出すというものです。

Objector 1A
その外部プログラムは、JavaFXプログラムでなくてもよさそうだな・・・

Hypothesizer 7
もちろんです。それは、処理を外部プロセス(リモートコンピューターで動作していてもかまいません)に委譲するために幅広く使えるテクニックです。

Objector 1A
それはいいな・・・

Objector 1B
盛り上がっているところに割り込んで申し訳ありませんけれどもね、あのね、私は、Javaプログラマーでもなければ、上で挙げられたどのプログラミング言語のプログラマーでもないんですよ。

Hypothesizer 7
ああ、・・・それはとても残念です・・・

Objector 1A
心からお悔やみを申し上げます・・・

Objector 1B
・・・それだけ?とても残念で、それでおしまい?

Hypothesizer 7
えーっと・・・

Objector 1B
そもそも、Microsoft .NET Frameworkはなぜ、あなたが挙げたプログラミング言語の一覧に含まれていないわけ?

Hypothesizer 7
サポートされていないからですが・・・

Objector 1B
それは分かってるわよ、でもなぜ?もっと詳しく言えば、LibreOfficeまたはApache OpenOfficeのプロセスを操る外部プログラムを作るのにはMicrosoft .NET Frameworkを使えるのに、LibreOfficeまたはApache OpenOfficeの中にMicrosoft .NET Frameworkコードを追加することは、なぜできないわけ?

Hypothesizer 7
それはいい質問です。理由は、LibreOfficeまたはApache OpenOfficeがMicrosoft .NET Frameworkランタイムをその内部で動作させられないことです。

Objector 1B
Microsoft .NET Frameworkで外部UNOサーバーを作るというのはどうなの?

Hypothesizer 7
実は、それは試したのですが、成功していません、今のところ(後記:後に、成功した。しかし、まだ1つ問題を解決していない)。実のところ、上で述べた、LibreOfficeまたはApache OpenOfficeのプロセスのリモートからの操作と、解決すべき問題が同じです。

Objector 1B
それでは、あなたが言うところの問題が解決されない限り、私は、Basicの牢獄に囚われたままなのね?

Objector 1A
私の心からのお悔やみをお受け取りください・・・

Objector 1B
あなたの悔やみなど要りませんよ!UNOなどという忌々しいものを学ばなくて済んで清清するわ!

Hypothesizer 7
マダム、実のところ、Basicを含めてどのプログラミング言語からでも、LibreOfficeまたはApache OpenOfficeのプロセスを操る際は、UNOを通して行ないます。したがって、・・・

Objector 1B
・・・

Objector 1A
Basicの牢獄から開放されるのはいいが、開発環境を構築するのが面倒じゃないのか?

Hypothesizer 7
10分とかかりません。その10分がBasicの牢獄からの開放に値するかどうかはあなたが決めることです。

Objector 1A
開発環境を構築する方法を知っていればの話だが・・・

Hypothesizer 7
LinuxとWindows用に、今後の記事で学びます。

Objector 1A
開発環境だけでは十分ではない。ビルドシステムが必要だ・・・

Hypothesizer 7
私が持っており、今後の記事で紹介します。

Objector 1A
ふーむ、・・・オーケー。

ところで、'スプレッドシートセル関数'とあんた言ってたな。スプレッドシートセル関数というのは、'SUM'みたいなやつか?

Hypothesizer 7
はい、そうです。

Objector 1A
自分が望むことが何であれ、それを行なう自分のセル関数をJavaで作れるということか?

Hypothesizer 7
はい、そのあなたが望むことが、Javaが実装できることであれば。

Objector 1A
・・・それでは、なぜ俺はこれまで、限られたビルトインの関数群で不便を忍ばなければならなかったんだ?

Hypothesizer 7
それは、UNOをご存知なかったからでしょう・・・

Objector 1B
Basicでスプレッドシートセル関数を作れる?

Hypothesizer 7
私が知る限り、作れません。JavaまたはC++で作ることができます。

Objector 1B
・・・


1-4: スプレッドシートを自分のプログラムのキャンバスとして使える


Hypothesizer 7
Basicのようなかなりハンディのあるプログラミング言語で大規模なコードを書くことのファンでは私はありませんが、LibreOfficeまたはApache OpenOfficeを拡張するのにJavaのような本格的なオブジェクト指向プログラミング言語を使えるので、プログラム規模にかかわらず、ちゅうちょなく、スプレッドシートを自分のプログラムのキャンバスとして使えます。

Objector 1A
ふーむ、スプレッドシートを俺のプログラムのキャンバスとして使うことに、ユーザーにとってのメリットがあることは認める。ユーザーは、スペルチェックをできるし、フォントを変えられるし、データ項目に注釈を付けられるし、表のセルに関数をセットできるし、連続データを容易に入力できるし、好みののチャートを作れるし、ウィンドウの状態を保存することができるし、・・・

Hypothesizer 7
はい。そうした機能は、スプレッドシートにビルトインされていて、あなたの側に何の面倒もなしにユーザーに提供されます。

Objector 1A
他方では、ユーザーは、俺がやって欲しくないことができる。例えば、スプレッドシートの行や列を挿入したり削除したりできる。

Hypothesizer 7
確かに。スプレッドシートをキャンバスとして使うのが常にベストの方法だとは言いません、しかし、多くの場合、ユーザーはそんな無意味に悪意のあることはしないでしょう、特に、想定ユーザーがあなたの場合。

Objector 1A
それは分かる、しかし、スプレッドシートをキャンバスとして使うことからくる不便もあるだろう。

Hypothesizer 7
あると思います、しかし、どんな不便を思い描いておられますか?

Objector 1A
使えるグラフィックコントロールが貧弱だ。

Hypothesizer 7
ああ、・・・そうかもしれません。チェックボックス、オプションボタン、コンボボックス、ボタン、ピクチャーボックス等の一般的な一揃いのグラフィックコントロールを使えますが、それらは特にリッチではありません。

Objector 1A
それに、セルのフォーカス順を制御できない。

Hypothesizer 7
できると思います、コードを若干書く必要はあるでしょうが。

Objector 1A
面倒なコードでなければよいが・・・

Hypothesizer 7
ユーティリティクラスを作ってしまえば、面倒は避けられます。

Objector 1A
ユーティリティクラスを作るのが面倒そうだ。

Hypothesizer 7
・・・今後の記事でそうしたユーティリティクラスを作りますので、それらを使うことができます、もし、お嫌でなければ・・・

Objector 1A
面倒がかからなければ、別にかまわない。

Hypothesizer 7
スプレッドシートの上でリッチなコントロールを使うというのは難しいかもしれませんが、リッチなコントロールを持つウィンドウをスプレッドシートにかぶせて表示することはできます、それが、リッチなコントロールの代用になるようでしたら。

Objector 1A
スプレッドシートをクリックしたら、それらのウィンドウはスプレッドシートの下に隠れてしまうのか?

Hypothesizer 7
ウィンドウを、常時上に表示されるウィンドウにすれば、そうはなりません。

Objector 1A
それでは、別の関係ないウィンドウをスプレッドシートの上にかぶせて置いても、常に上に表示されることになってしまう・・・

Hypothesizer 7
そうです。

Objector 1A
それに、スプレッドシートを動かしたとき、スプレッドシートと一緒に動いてくれない・・・

Hypothesizer 7
動きません、それらのウィンドウを動かすコードを書かない限りは。・・・格好よくないことは承知しています。善意のユーザーだけ、特にあなたが、想定通りに操作するという想定の元のプログラムです。

Objector 1A
ああ、確かに、意図されたユーザーを明確にすることで、ユーザーに自由を大きく与え、プログラマーから面倒を大きく省くことができる・・・


2: 結びとその先


Hypothesizer 7
この記事はこれまでです。UNOをマスターすれば、UNOを通してLibreOfficeまたはApache OpenOfficeを使うことで、さまざまなプログラミング言語からさまざまなドキュメントファイルを読み書きできるようになり、その他、さまざまなプログラミング言語からLibreOfficeまたはApache OpenOfficeのプロセスを操ることができるようになり、LibreOfficeまたはApache OpenOfficeの中で、マクロの内外でもっとさまざまなことができるようになり、プログラムを、ユーザーに自由を増やし自分には面倒を減らして作ることができるようになります。

もし、UNOやUNOにまつわるメカニズムがこの時点で不明瞭であれば、それは自然なことです。UNOが何かを明確にすることなくUNOについて話してきたのです。UNOが何か、および、UNO、LibreOffice、Apache OpenOfficeのそれぞれの間の関係は、次の記事で学びます。


参考資料


  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide
<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>