2017年7月29日土曜日

27: スプレッドシートセルフォーマット(フォーマットプロパティ)を得たりセットしたりする

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

Main body START

LibreOfficeまたはApache OpenOfficeのCalcスプレッドシートを拡張機能を通してJavaまたはマクロプログラムから操作する(読むまたは書く)方法を知る

スプレッドシートセルフォーマットをどのように得たりセットしたりできるか?

-Hypothesizer

我々はスプレッドシートをデータを管理する目的で使うので、ファンシーなビジュアルを作ることには特に興味がない。しかし、一部のデータを強調するために、ある種のスプレッドシートセルフォーマットプロパティをセットするのは役に立つかもしれない。

-Rebutter

「スプレッドシートセルフォーマット」および「スプレッドシートセルフォーマットプロパティ」という用語を君がどのように使用しているのか説明してほしい。

-Hypothesizer

私は、スプレッドシートセルフォーマットの1つの属性を「スプレッドシートセルフォーマットプロパティ」と呼び、スプレッドシートセルフォーマットの全属性の総体を「スプレッドシートセルフォーマット」と呼んでいる。例えば、スプレッドシートセルの背景色はスプレッドシートセルフォーマットプロパティであり、背景色、前景色、フォント名、などの総体がスプレッドシートセルフォーマットだ。

-Rebutter

ははあ。

-Hypothesizer

実際には、多くのスプレッドシートフォーマットプロパティがあり、それらの全てを挙げることには私は興味がない。我々は以下のプロパティのみを扱う。

  • 背景色
  • 背景色が透明かどうか
  • フォント色
  • フォント名
  • フォントサイズ
  • フォントの姿勢
  • フォントの太さ
  • テキストアンダーライン(下線)のスタイル
  • テキストアンダーライン(下線)の色が自動かどうか
  • テキストアンダーライン(下線)の色
  • テキストオーバーライン(上線)のスタイル
  • テキストオーバーライン(上線)の色が自動かどうか
  • テキストオーバーライン(上線)の色
  • テキスト取り消し線のスタイル
  • テキストをラップするかどうか
  • テキストの水平方向位置合わせ(横配置)
  • テキストの垂直方向位置合わせ(縦配置)
  • 左ボーダーライン(枠線)
  • 右ボーダーライン(枠線)
  • 上ボーダーライン(枠線)
  • 下ボーダーライン(枠線)
-Rebutter

一部のプロパティ、例えばフォント名は、セル毎でなく文字ごとにセットするものではないのか?

-Hypothesizer

セル毎にも文字毎にもセットできる。今は、セル毎の設定について話している。文字毎の設定については次の記事で話そう。

-Rebutter

左ボーダーラインといったプロパティは漠然としすぎているのではないか?ボーダーラインスタイル、ボーダーライン色、などがあるはずだ。

-Hypothesizer

ああ、上に挙げたプロパティは、スプレッドシートセルUNOオブジェクトのプロパティに応じている。実のところ、スプレッドシートセルプロパティは、スプレッドシートセルUNOオブジェクトのプロパティだ。そうしたボーダーライン関連プロパティについては、それぞれ、ボーダーラインスタイル、ボーダーライン色、などを保持するstruct(Javaではクラスにマッピングされる)がセットされる。

-Rebutter

それらのボーダーライン関連プロパティがstructにまとめられ、テキストアンダーライン関連プロパティがまとめられないのはなぜなのだろうか。

-Hypothesizer

正直言って、私にも分からない。プロパティの粒度が一様でないように私には思われる。

-Rebutter

「背景色が透明かどうか」の意味合いが私には理解できない。透明な背景色というのはどう役に立つのか?

-Hypothesizer

正直なところ、私は知らない。我々が使う限りでは、背景色が必要なときは「透明でない」、不要なときは「透明である」にセットする。

-Rebutter

「テキストアンダーライン(下線)の色が自動かどうか」というのはどういう意味なのか?

-Hypothesizer

自動の場合、フォントの色と同じになる。

-Rebutter

テキスト取り消し線の色はなぜ指定できないのか?

-Hypothesizer

正直なところ、私は知らない。ともかく、その色は必ず自動になる。

-Rebutter

いいだろう。

-Hypothesizer

スプレッドシートセルプロパティは、セルUNOオブジェクトのUNOコンポーネントが実装している'com.sun.star.beans.XPropertySet'UNOインターフェースを使って操作できる。

-Rebutter

なるほど。

-Hypothesizer

以下が、セットするプロパティの名称と値だ。

  • 背景色 −> CellBackColor: integerのピクセル値
  • 背景色が透明かどうか −> IsCellBackgroundTransparent: booleanのtrue(透明である)またはfalse(透明でない)
  • フォント色 −> CharColor: integerのピクセル値
  • フォント名 −> CharFontName: フォント名string
  • フォントサイズ −> CharHeight: floatのフォントポイントサイズ
  • フォントの姿勢 −> CharPosture: enumのcom.sun.star.awt.FontSlant.(NONE、OBLIQUE、ITALIC、DONTKNOW、REVERSE_OBLIQUE、REVERSE_ITALIC)
  • フォントの太さ −> CharWeight: floatのcom.sun.star.awt.FontWeight.(DONTKNOW、THIN、ULTRALIGHT、LIGHT、SEMILIGHT、NORMAL、SEMIBOLD、BOLD、ULTRABOLD、BLACK)
  • テキストアンダーライン(下線)のスタイル −> CharUnderline: shortのcom.sun.star.awt.FontUnderline.(NONE、SINGLE、DOUBLE、DOTTED、DONTKNOW、DASH、LONGDASH、DASHDOT、DASHDOTDOT、SMALLWAVE、WAVE、DOUBLEWAVE、BOLD、BOLDDOTTED、BOLDDASH、BOLDLONGDASH、BOLDDASHDOT、BOLDDASHDOTDOT、BOLDWAVE)
  • テキストアンダーライン(下線)の色が自動かどうか −> CharUnderlineHasColor: booleanのtrue(自動である)またはfalse(自動でない)
  • テキストアンダーライン(下線)の色 −> CharUnderlineColor: integerのピクセル値
  • テキストオーバーライン(上線)のスタイル −> CharOverline: shortのcom.sun.star.awt.FontUnderline.(NONE、SINGLE、DOUBLE、DOTTED、DONTKNOW、DASH、LONGDASH、DASHDOT、DASHDOTDOT、SMALLWAVE、WAVE、DOUBLEWAVE、BOLD、BOLDDOTTED、BOLDDASH、BOLDLONGDASH、BOLDDASHDOT、BOLDDASHDOTDOT、BOLDWAVE)
  • テキストオーバーライン(上線)の色が自動かどうか −> CharOverlineHasColor: booleanのtrue(自動である)またはfalse(自動でない)
  • テキストオーバーライン(上線)の色 −> CharOverlineColor: integerのピクセル値
  • テキスト取り消し線のスタイル −> CharStrikeout: shortのcom.sun.star.awt.FontStrikeout.(NONE、SINGLE、DOUBLE、DONTKNOW、BOLD、SLASH、X)
  • テキストをラップするかどうか −> IsTextWrapped: booleanのtrue(ラップする)またはfalse(ラップしない)
  • テキストの水平方向位置合わせ(横配置) −> HoriJustify: enumのcom.sun.star.table.CellHoriJustify.(STANDARD、LEFT、CENTER、RIGHT、BLOCK、REPEAT)
  • テキストの垂直方向位置合わせ(縦配置) −> VertJustify: enumのcom.sun.star.table.CellVertJustify.(STANDARD、TOP、CENTER、BOTTOM)
  • 左ボーダーライン −> LeftBorder: com.sun.star.table.BorderLine2のインスタンス
  • 右ボーダーライン −> RightBorder: com.sun.star.table.BorderLine2のインスタンス
  • 上ボーダーライン −> TopBorder: com.sun.star.table.BorderLine2のインスタンス
  • 下ボーダーライン −> BottomBorder: com.sun.star.table.BorderLine2のインスタンス

'com.sun.star.table.BorderLine2'structは以下のメンバーを持ち、各メンバーは以下の値を持つ。

  • LineStyle: shortのcom.sun.star.table.BorderLineStyle.(NONE、SOLID、DOTTED、DASHED、DOUBLE、THINTHICK_SMALLGAP、THINTHICK_MEDIUMGAP、THINTHICK_LARGEGAP、THICKTHIN_SMALLGAP、THICKTHIN_MEDIUMGAP、THICKTHIN_LARGEGAP、EMBOSSED、ENGRAVED、OUTSET、INSET、FINE_DASHED、DOUBLE_THIN、DASH_DOT、DASH_DOT_DOT、BORDER_LINE_STYLE_MAX)
  • LineWidth: integerの線幅(1/100 mm)
  • Color: integerのピクセル値
-Rebutter

integerのピクセル値はどうすれば得られるのか?

-Hypothesizer

'java.awt.Color'の'getRGB'メソッドの戻り値として得ることができる。

-Rebutter

いいだろう。

-Hypothesizer

結局、前記事のコードの後に以下のコードを書いた。

   XPropertySet l_currentSpreadSheetCellInXPropertySet = (XPropertySet) UnoRuntime.queryInterface (XPropertySet.class, l_currentSpreadSheetCell);
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CellBackColor", new Integer ( (new Color (255, 255, 0)).getRGB ()));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("IsCellBackgroundTransparent", new Boolean (false));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharColor", new Integer ( (new Color (0, 255, 0)).getRGB ()));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharFontName", "Liberation Mono");
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharHeight", new Float (16.0F));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharPosture", FontSlant.ITALIC);
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharWeight", new Float (FontWeight.BOLD));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharUnderline", new Short (FontUnderline.DOTTED));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharUnderlineHasColor", new Boolean (true));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharUnderlineColor", new Integer ( (new Color (255, 0, 0)).getRGB ()));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharOverline", new Short (FontUnderline.BOLDDOTTED));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharOverlineHasColor", new Boolean (true));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharOverlineColor", new Integer ( (new Color (255, 0, 0)).getRGB ()));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("CharStrikeout", new Short (FontStrikeout.DOUBLE));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("IsTextWrapped", new Boolean (true));
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("HoriJustify", CellHoriJustify.RIGHT);
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("VertJustify", CellVertJustify.BOTTOM);
   BorderLine2 l_leftBorderline = new BorderLine2 ();
   l_leftBorderline.LineStyle = BorderLineStyle.DOTTED;
   l_leftBorderline.LineWidth = 34;
   l_leftBorderline.Color = (new Color (255, 0, 0)).getRGB ();
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("LeftBorder2", l_leftBorderline);
   BorderLine2 l_rightBorderline = new BorderLine2 ();
   l_rightBorderline.LineStyle = BorderLineStyle.DASHED;
   l_rightBorderline.LineWidth = 26;
   l_rightBorderline.Color = (new Color (0, 255, 0)).getRGB ();
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("RightBorder2", l_rightBorderline);
   BorderLine2 l_topBorderline = new BorderLine2 ();
   l_topBorderline.LineStyle = BorderLineStyle.FINE_DASHED;
   l_topBorderline.LineWidth = 18;
   l_topBorderline.Color = (new Color (0, 0, 255)).getRGB ();
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("TopBorder2", l_topBorderline);
   BorderLine2 l_bottomBorderline = new BorderLine2 ();
   l_bottomBorderline.LineStyle = BorderLineStyle.DASH_DOT;
   l_bottomBorderline.LineWidth = 52;
   l_bottomBorderline.Color = (new Color (255, 0, 255)).getRGB ();
   l_currentSpreadSheetCellInXPropertySet.setPropertyValue ("BottomBorder2", l_bottomBorderline);

また、以下のimport命令を追加した。

import java.awt.Color;
import com.sun.star.table.CellHoriJustify;
import com.sun.star.table.CellVertJustify;
import com.sun.star.table.BorderLine2;
import com.sun.star.table.BorderLineStyle;
import com.sun.star.awt.FontSlant;
import com.sun.star.awt.FontWeight;
import com.sun.star.awt.FontUnderline;
import com.sun.star.awt.FontStrikeout;
-Rebutter

プロパティをセットはしたが、得てはいない。プロパティを得たい場合は、'getPropertyValue'メソッドを呼べばよいだけか?

-Hypothesizer

そうだ。

Main body END

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