<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>
LibreOfficeまたはApache OpenOfficeのCalcスプレッドシートを拡張機能を通してJavaまたはマクロプログラムから操作する(読むまたは書く)方法を知る
我々はスプレッドシートをデータを管理する目的で使うので、ファンシーなビジュアルを作ることには特に興味がない。しかし、一部のデータを強調するために、ある種のスプレッドシートセルフォーマットプロパティをセットするのは役に立つかもしれない。
「スプレッドシートセルフォーマット」および「スプレッドシートセルフォーマットプロパティ」という用語を君がどのように使用しているのか説明してほしい。
私は、スプレッドシートセルフォーマットの1つの属性を「スプレッドシートセルフォーマットプロパティ」と呼び、スプレッドシートセルフォーマットの全属性の総体を「スプレッドシートセルフォーマット」と呼んでいる。例えば、スプレッドシートセルの背景色はスプレッドシートセルフォーマットプロパティであり、背景色、前景色、フォント名、などの総体がスプレッドシートセルフォーマットだ。
ははあ。
実際には、多くのスプレッドシートフォーマットプロパティがあり、それらの全てを挙げることには私は興味がない。我々は以下のプロパティのみを扱う。
- 背景色
- 背景色が透明かどうか
- フォント色
- フォント名
- フォントサイズ
- フォントの姿勢
- フォントの太さ
- テキストアンダーライン(下線)のスタイル
- テキストアンダーライン(下線)の色が自動かどうか
- テキストアンダーライン(下線)の色
- テキストオーバーライン(上線)のスタイル
- テキストオーバーライン(上線)の色が自動かどうか
- テキストオーバーライン(上線)の色
- テキスト取り消し線のスタイル
- テキストをラップするかどうか
- テキストの水平方向位置合わせ(横配置)
- テキストの垂直方向位置合わせ(縦配置)
- 左ボーダーライン(枠線)
- 右ボーダーライン(枠線)
- 上ボーダーライン(枠線)
- 下ボーダーライン(枠線)
一部のプロパティ、例えばフォント名は、セル毎でなく文字ごとにセットするものではないのか?
セル毎にも文字毎にもセットできる。今は、セル毎の設定について話している。文字毎の設定については次の記事で話そう。
左ボーダーラインといったプロパティは漠然としすぎているのではないか?ボーダーラインスタイル、ボーダーライン色、などがあるはずだ。
ああ、上に挙げたプロパティは、スプレッドシートセルUNOオブジェクトのプロパティに応じている。実のところ、スプレッドシートセルプロパティは、スプレッドシートセルUNOオブジェクトのプロパティだ。そうしたボーダーライン関連プロパティについては、それぞれ、ボーダーラインスタイル、ボーダーライン色、などを保持するstruct(Javaではクラスにマッピングされる)がセットされる。
それらのボーダーライン関連プロパティがstructにまとめられ、テキストアンダーライン関連プロパティがまとめられないのはなぜなのだろうか。
正直言って、私にも分からない。プロパティの粒度が一様でないように私には思われる。
「背景色が透明かどうか」の意味合いが私には理解できない。透明な背景色というのはどう役に立つのか?
正直なところ、私は知らない。我々が使う限りでは、背景色が必要なときは「透明でない」、不要なときは「透明である」にセットする。
「テキストアンダーライン(下線)の色が自動かどうか」というのはどういう意味なのか?
自動の場合、フォントの色と同じになる。
テキスト取り消し線の色はなぜ指定できないのか?
正直なところ、私は知らない。ともかく、その色は必ず自動になる。
いいだろう。
スプレッドシートセルプロパティは、セルUNOオブジェクトのUNOコンポーネントが実装している'com.sun.star.beans.XPropertySet'UNOインターフェースを使って操作できる。
なるほど。
以下が、セットするプロパティの名称と値だ。
- 背景色 −> 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のピクセル値
integerのピクセル値はどうすれば得られるのか?
'java.awt.Color'の'getRGB'メソッドの戻り値として得ることができる。
いいだろう。
結局、前記事のコードの後に以下のコードを書いた。
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;
プロパティをセットはしたが、得てはいない。プロパティを得たい場合は、'getPropertyValue'メソッドを呼べばよいだけか?
そうだ。