3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net,OpenOffice).NetからCalc操作時にセルのプロパティを変更する

.NetからOpenOfficeのCalcを操作する基本の方法は、(.Net,OpenOffice).NetからCalc操作時に罫線(枠線)を引くが参考になります。

今回は、セルの文字色、背景色、文字の大きさ、セル枠までのスペース(パディング)を変更する方法です。

サンプルは、OpenOffice.org_3.2_SDK\sdk\examples\CLI\CSharp\Spreadsheet\SpreadsheetDocHelper.cs の prepareRange メソッドに書いてあります。

サンプルでは下記のようになっています。

// --- Change cell properties. ---

xPropSet = (unoidl.com.sun.star.beans.XPropertySet) xCell;

// from styles.CharacterProperties

xPropSet.setPropertyValue(

"CharColor", new uno.Any( (Int32) 0x003399 ) );

xPropSet.setPropertyValue(

"CharHeight", new uno.Any( (Single) 20.0 ) );

// from styles.ParagraphProperties

xPropSet.setPropertyValue(

"ParaLeftMargin", new uno.Any( (Int32) 500 ) );

// from table.CellProperties

xPropSet.setPropertyValue(

"IsCellBackgroundTransparent", new uno.Any( false ) );

xPropSet.setPropertyValue(

"CellBackColor", new uno.Any( (Int32) 0x99CCFF ) );

ハマったのは色の設定です。

.Net の Color構造体をそのまま使おうとしたのですが、アルファ値を含むので使えません。

ColorTranslator.ToWin32 メソッドを使ってアルファ値を含まないInt32型の値を使おうとしましたが、どうも違う色になってしまいます。

ColorTranslator.ToWin32 メソッドの返り値で表すカラー情報はCOLORREF型という4バイトの符合なし整数のようで、内部的には 0x00BBGGRR で色を表しているようです。

OpenOfficeのプロパティに設定すべきなのは 0xRRGGBB になるので、違う色になってしまうのですね。

結局色に関して、Color構造体を 0xRRGGBB に変換するときは Rに2^16したもの + Gに2^8したもの + B としました。

逆に 0xRRGGBB から Color構造体を作るときは、Rは16ビット右シフト,Gは8ビット右シフト,Bはそのまま の値で Color.FromArgb メソッドから生成することにしました。

さて、OpenOfficeCalcへの操作をいちいちソース内に書くのは面倒です。

ということで、OpenOfficeCalcへの操作を汎用化したDLLを作成してます。まだ未完成なので問題があるかと思いますが、今回のセルプロパティの部分も含めて載せてみたいと思います。

以前に書いた罫線へのアクセスやセルへのアクセス、デリゲートを使った部分も入っています。(C# .NetFramework2.0)

文字数制限のため、ハイライト無し&&分割して掲載します。

NetからOpenOfficeCalcへの操作を汎用化したDLL(Part1)

NetからOpenOfficeCalcへの操作を汎用化したDLL(Part2)

NetからOpenOfficeCalcへの操作を汎用化したDLL(Part3)

参考:

●Win32API(C言語)編 第13章 色の指定

Service CellProperties