2020年4月12日日曜日

39: スプレッドシートドキュメントのページのサイズをUNOを用いてセットする

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

任意のスプレッドシートドキュメント(典型的には、OpenDocument Spreadsheet/Office Open XML Workbook/Microsoft Excelファイルに関連付けられている)、LibreOfficeを用いて

話題


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インスタンスにロードされた任意のスプレッドシートドキュメントの任意のページのサイズを読者のプログラムからセットする方法を知る。
ト書き
Hypothesizer 7、Objector 39A、Objector 39Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
本記事では、LibreOfficeまたはApache OpenOfficeインスタンスにロードされた任意のスプレッドシートドキュメントの任意のページのサイズを、私たちのプログラムからセットする方法を知ります。

ご注目いただきたいのですが、私は「スプレッドシートドキュメント」と言ったのであって、「スプレッドシートドキュメントファイル」とは言いませんでした。

Objector 39A
それには気付いたけど、あんたの意図には気付けないなあ。

Hypothesizer 7
サー、ファイルというのは、ビット群のシーケンスがあるストレージ(例えば、ハードディスク)に格納されたものであり、'ドキュメント'で私が意味するのは、ひとかたまりのドキュメント的情報を代表するオブジェクトです。...LibreOfficeメニューで'File' -> 'New' -> 'Spreadsheet'とすると、新たなドキュメントが作成されますが、それは、いかなるファイルにも関連付けられていません、少なくとも、まだ。ある特定のフォーマットのドキュメントファイルをLibreOfficeインスタンスにロードすると、それは、LibreOfficeインスタンス内のドキュメントになります。

Objector 39A
つまり、あんたは、LibreOfficeインスタンスにロードされたそうしたオブジェクトを操作することについて話すのだということかな、直接にファイルを書くことについてではなく?

Hypothesizer 7
はい、そうします、しかし、私の趣旨は、ファイルがLibreOfficeインスタンスにスプレッドシートドキュメントとしてロードできさえすれば、ファイルフォーマットはどうでもよいということです、そうしたドキュメントはジェネリックですから。

Objector 39A
「ジェネリック」?

Hypothesizer 7
そうしたドキュメントはどれも、何か特定のファイルフォーマットのものというわけではないということです: ファイルフォーマットは、ドキュメントがストレージに格納される際にそれがどのようにシリアライズされるかだけの問題です。

Objector 39A
それじゃあ、ページサイズは同じ方法でセットできると、ドキュメントがMicrosoft Excelバイナリーファイルからロードされようが、Office Open XML Workbookからだろうが、他の何からだろうが...

Hypothesizer 7
はい。そして、ドキュメントは、お望みのフォーマットで格納できます、例えば、PDFです。

Objector 39A
ああ。

Hypothesizer 7
ご注意いただきたいのですが、「任意のページのサイズを〜セットする」と申しましたが、各スプレッドシートの全ページはすべからく同一サイズを共有することになります。

Objector 39B
じゃあ、あなたは嘘をついたわけね...

Hypothesizer 7
そうでしょうか、マダム?私はそうは思いません: あなたは実際に任意のページのサイズをセットできます、ただ、そのサイズを、そのシートの他のページから独立してはセットできないというだけです。


本体


1: メカニズムとその影響を理解する


Hypothesizer 7
実のところ、ページサイズはページ自体やシート自体にはセットされておらず、シートに割り当てられたページスタイルにセットされています。

Objector 39A
つまらん言葉遊びをしているだけに聞こえるぞ。

Hypothesizer 7
いいえ、それは実際的重要性のあることです: スプレッドシートドキュメントはいくつかのページスタイルを持っていて、その内の1つが各シートに割り当てられており、それが意味することは、あるページスタイルが複数のシートに割り当てられているかもしれないということです。

Objector 39A
ああ、つまり、ページサイズを独立して変更できないんだな。

Hypothesizer 7
もしも、単一シートだけのページ群のサイズを変更したいのであれば、新たなページスタイルを作成・セットアップして、その新たなページスタイルをその単一シートに割り当てなければならないでしょう。

Objector 39A
面倒だなあ...、とにかく、そうする方法をあんたは論じるんだろう?

Hypothesizer 7
はい、ある以降のセクションにて。


2: スプレッドシートドキュメントの全ページスタイル群を取得する


Hypothesizer 7
スプレッドシートドキュメントに格納されている全ページスタイル群を取得しましょう。

実のところ、以下は、それを行なうJavaコードです('a_unoDocumentInXComponent'は、ドキュメントUNOオブジェクトです)。

@Java ソースコード
import com.sun.star.container.XNameContainer;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.style.XStyleFamiliesSupplier;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;

		XComponent a_unoDocumentInXComponent;
		~
		XSpreadsheetDocument l_unoSpreadSheetsDocumentInXSpreadsheetDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface (XSpreadsheetDocument.class, a_unoDocumentInXComponent);
		if (l_unoSpreadSheetsDocumentInXSpreadsheetDocument == null) {
			// The document is not any spread sheets document.
		}
		else {
			try {
				XModel l_unoSpreadSheetsDocumentInXModel = (XModel) UnoRuntime.queryInterface (XModel.class, l_unoSpreadSheetsDocumentInXSpreadsheetDocument);
				XStyleFamiliesSupplier l_unoSpreadSheetsDocumentInXStyleFamiliesSupplier = (XStyleFamiliesSupplier) UnoRuntime.queryInterface (XStyleFamiliesSupplier.class, l_unoSpreadSheetsDocumentInXSpreadsheetDocument);
				XNameContainer l_pageStylesInXNameContainer = (XNameContainer) AnyConverter.toObject (XNameContainer.class , l_unoSpreadSheetsDocumentInXStyleFamiliesSupplier.getStyleFamilies ().getByName ("PageStyles"));
			}
		}

Objector 39A
「ドキュメントUNOオブジェクト」なるものを、何の説明もなく突然持ち込んだな...

Hypothesizer 7
実のところ、そのようなことはしておりません: それは、'開始コンテキスト'に含まれています、もっと具体的には、ある以前の記事のここです。

Objector 39A
...実のところ、私は全ページスタイルに興味はない、ある特定のシートのページスタイルに興味がある。

Hypothesizer 7
全ページスタイルからそれを取り上げる方法を、次セクションで知るでしょう。

Objector 39A
...

Hypothesizer 7
そのコードはUNOがサポートされている任意のプログラミング言語で書けますが、ここには、それを示しません。

Objector 39B
なんで?

Hypothesizer 7
なぜなら、私が本記事にはJavaコードしか準備していないためです(多分、いくつかの他のプログラミング言語のコードを以後に示すでしょう)。今のところは、Java版からご自分のプログラミング言語の版をあなたが導けるように期待しています。

Objector 39B
...


3: 意図するシートのページスタイルを取得する


Hypothesizer 7
意図するシートのページスタイルの名前を事前にご存知でしたら、そのページスタイルを、以下のようにして、取得できます('l_pageStyleName'は、その名前です)。

@Java ソースコード
import com.sun.star.beans.XPropertySet;
import com.sun.star.style.XStyle;

				String l_pageStyleName = null;
				XPropertySet l_pageStyleInXPropertySet = null;
				~
				l_pageStyleInXPropertySet = UnoRuntime.queryInterface (XPropertySet.class, AnyConverter.toObject (XStyle.class, l_pageStylesInXNameContainer.getByName (l_pageStyleName)));

Objector 39A
ああ、例えば、OpenDocument Spreadsheetファイルでは多くの場合、'Default'だよな。

But if not?

Hypothesizer 7
特定のシートインデックスのシートのページスタイルの名前は、以下のようにして取得できます('l_sheetIndex'は、シートインデックスです('0'から始まる))。

@Java ソースコード
import com.sun.star.container.XIndexAccess;
import com.sun.star.sheet.XSpreadsheets2;

				int l_sheetIndex = 0;
				~
				XSpreadsheets2 l_unoSpreadSheetsInXSpreadsheets2 = (XSpreadsheets2) UnoRuntime.queryInterface (XSpreadsheets2.class, l_unoSpreadSheetsDocumentInXSpreadsheetDocument.getSheets ());
				XIndexAccess l_unoSpreadSheetsInXIndexAccess = (XIndexAccess) UnoRuntime.queryInterface (XIndexAccess.class, l_unoSpreadSheetsInXSpreadsheets2);
				int l_numberOfSheets = l_unoSpreadSheetsInXIndexAccess.getCount ();
				XPropertySet l_unoSpreadSheetInXPropertySet = (XPropertySet) UnoRuntime.queryInterface (XPropertySet.class, l_unoSpreadSheetsInXIndexAccess.getByIndex (l_sheetIndex));
				l_pageStyleName = (String) l_unoSpreadSheetInXPropertySet.getPropertyValue ("PageStyle");

Objector 39A
...ああ、それじゃあ、当該シートにアクセスして、それからページスタイル名を得るわけだ。


4: ページサイズをページスタイルにセットする


Hypothesizer 7
ページサイズはページスタイルに以下のようにセットできます(サイズはA4縦サイズです(数字群は100分の1ミリメートル単位です))。

@Java ソースコード
import com.sun.star.awt.Size;

						Size i_pagesSize = new Size (21000, 29700);
						~
						l_pageStyleInXPropertySet.setPropertyValue ("Size", i_pagesSize);
						l_pageStyleInXPropertySet.setPropertyValue ("IsLandscape", Boolean.valueOf (false));

Objector 39A
つまり...

Hypothesizer 7
'29700'は'297.00' mmを意味します。

Objector 39A
もちろんだ。


5: 新たなページスタイルを作成してそれをシートに割り当てる


Hypothesizer 7
新たなページスタイルが必要(当該ページスタイルを共有している他のシート群のサイズを変更したくないがゆえに)なのであれば、それは'.uno:StyleNewByExample'というUNOディスパッチコマンドで作成できます。

Objector 39B
...「UNOディスパッチコマンド」は'開始コンテキスト'に含まれてない、と思うけど。

Hypothesizer 7
仰るとおりです。プログラミング言語毎に任意のUNOディスパッチコマンドを実行する方法は、以下の記事群(Java編C++編C#編Python編LibreOfficeまたはApache OpenOffice Basic編)に記述されています。

Objector 39B
...まあいいでしょう。

Hypothesizer 7
新たなページスタイルはシートに以下のように割り当てることができます('l_newPageStyleName'は新たなページスタイルの名前です)。

@Java ソースコード
						String l_newPageStyleName;
						~
						l_unoSpreadSheetInXPropertySet.setPropertyValue ("PageStyle", l_newPageStyleName);


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


Hypothesizer 7
実は、スプレッドシートドキュメントの全ページにあるサイズをセットするドキュメントテーラーを、私が作成しました。

Objector 39A
「ドキュメントテーラー」

Hypothesizer 7
ある以前の記事のあるサブセクションをご参照ください。

Objector 39A
...

Hypothesizer 7
もっと精巧なテーラリングをされたいのであれば、そのドキュメントテーラーに手を加えることもできます。

Objector 39A
あんたのテーラーはどこにある?

Hypothesizer 7
私のテーラークラスは、このZIPファイルに格納されている'unoUtilitiesToBeDisclosed'プロジェクト内にある'theBiasPlanet.unoUtilities.documentsHandling.UnoSpreadSheetsDocumentSetPageStylesTailor'です。

実際には、そのZIPファイルは、ある以前の記事(コンセプトあるJava実装あるC++実装あるC#実装あるPython実装)で紹介されたファイルコンバージョンサンプルプログラム群のものであり、そのプロジェクトをビルドする方法およびプログラム群を実行する方法は、その以前の記事に記述されています。

任意のドキュメントテーラーを使用するための、ファイルコンバージョン群命令CSVファイルの仕様は、前記事のここに記述されています。


7: 結びとその先


Hypothesizer 7
これで、私たちは、LibreOfficeまたはApache OpenOfficeインスタンスにロードされた任意のスプレッドシートドキュメントの任意のページのサイズを、私たちのプログラムからセットする方法を知りました。

そのスプレッドシートドキュメントは、OpenDocument Spreadsheetファイルからロードされたものかもしれないし、Microsoft Excelファイルからロードされたものかもしれないし、Calcプログラムがロードできる他の任意のファイルからロードされたものかもしれません。ドキュメントは、Calcプログラムが格納できる任意のファイル、例えば、PDFファイル、に格納できます。

任意のページスタイル(任意のワードプロセッサードキュメントのまたは任意のスプレッドシートドキュメントの)のその他のプロパティ群を、私たちのプログラムからセットする方法を、以後のいくつかの記事で見ます。


参考資料


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