.NetからOpenOfficeCalcへの操作を汎用化したDLL(Part2)の続きで、Part3です。(C#)
#region 各プロパティ設定デリゲートメソッド
/// <summary>文字色を設定する。(デリゲート経由で呼び出される) </summary>
/// <param name="prm"></param>
private void SetCharColorDelegate(PropertiesDelegateParam prm)
prm.XPropertySet.setPropertyValue("CharColor", new uno.Any(ConvertOooColorFromDotNetColor(prm.ColorValue)));
}
/// <summary>セル背景色を設定する。(デリゲート経由で呼び出される) </summary>
/// <param name="prm"></param>
private void SetCellBackColorDelegate(PropertiesDelegateParam prm) {
//下記の形式だとNGみたい
//prm.XPropertySet.setPropertyValue("CellBackColor", new uno.Any(ColorTranslator.ToWin32(prm.ColorValue)));
prm.XPropertySet.setPropertyValue("CellBackColor", new uno.Any(ConvertOooColorFromDotNetColor(prm.ColorValue)));
}
/// <summary> セル文字の大きさを設定する。(デリゲート経由で呼び出される</summary>)
/// <param name="prm"></param>
private void SetCharHeightDelegate(PropertiesDelegateParam prm) {
prm.XPropertySet.setPropertyValue("CharHeight", new uno.Any(prm.FloatValue ));
}
/// <summary> セル枠までのスペースを設定する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void SetParagraphDelegate(PropertiesDelegateParam prm) {
prm.XPropertySet.setPropertyValue(GetParagraphName(prm.SideValue), new uno.Any(prm.IntValue));
}
/// <summary>背景色を透過設定する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void SetIsCellBackgroundTransparentDelegate(PropertiesDelegateParam prm) {
prm.XPropertySet.setPropertyValue("IsCellBackgroundTransparent", new uno.Any(prm.BoolValue));
}
/// <summary>文字色を取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetCharColorDelegate(PropertiesDelegateParam prm) {
prm.ColorValue = Color.FromArgb((int)(prm.XPropertySet.getPropertyValue("CharColor").Value));
}
/// <summary> セル背景色を取得する。(デリゲート経由で呼び出される) </summary>
/// <param name="prm"></param>
private void GetCellBackColorDelegate(PropertiesDelegateParam prm) {
//下記の形式だとNGみたい
//prm.ColorValue = ColorTranslator.FromWin32((int)(prm.XPropertySet.getPropertyValue("CellBackColor").Value));
//prm.ColorValue = Color.FromArgb((int)(prm.XPropertySet.getPropertyValue("CellBackColor").Value));
prm.ColorValue = ConvertDotNetColorFromOooColor((int)(prm.XPropertySet.getPropertyValue("CellBackColor").Value));
}
/// <summary> セル文字の大きさを取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetCharHeightDelegate(PropertiesDelegateParam prm){
prm.FloatValue = (float)(prm.XPropertySet.getPropertyValue("CharHeight").Value);
}
/// <summary>セル枠までのスペースを取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetParagraphDelegate(PropertiesDelegateParam prm){
prm.IntValue = (int)(prm.XPropertySet.getPropertyValue(GetParagraphName(prm.SideValue)).Value);
}
/// <summary> 背景色を透過設定を取得する。(デリゲート経由で呼び出される)</summary>
/// <param name="prm"></param>
private void GetIsCellBackgroundTransparentDelegate(PropertiesDelegateParam prm){
prm.BoolValue = (bool)(prm.XPropertySet.getPropertyValue("IsCellBackgroundTransparent").Value);
}
/// <summary>パディング名を取得 </summary>
/// <param name="side"></param>
/// <returns></returns>
private string GetParagraphName(ParagraphSide side){
string strPropName = "";
switch (side) {
case ParagraphSide.Left:
strPropName = "ParaLeftMargin";
break;
case ParagraphSide.Right:
strPropName = "ParaRighttMargin";
break;
case ParagraphSide.Top:
strPropName = "ParaTopMargin";
break;
case ParagraphSide.Bottom:
strPropName = "ParaBottomMargin";
break;
default:
break;
}
return strPropName;
}
/// <summary> カラー情報をOpenOfficeで扱える形式に変換</summary>
private int ConvertOooColorFromDotNetColor(Color color) {
return (int)((int)color.R * Math.Pow(2, 16)
+ (int)color.G * Math.Pow(2, 8)
+ (int)color.B);
}
/// <summary>OpenOfficeのカラー情報を.Netの Color に変換</summary>
private Color ConvertDotNetColorFromOooColor(int iClr)
{
if (iClr < 0)
return Color.Transparent;//-1時は透明とみなす
return Color.FromArgb(iClr >> 16 , (iClr >> 8) & 0xFF, iClr & 0xFF );
}
#endregion
/// <summary> シートが選択されていないなら例外発生 </summary>
private void IsSheetNullCheckException(){
if (!IsSheetNullCheck()){
throw new OpenOfficeException("OpenOffice操作クラス例外:sheetが選択されていません。");
}
}
/// <summary>セルが選択されていないなら例外発生 </summary>
private void IsCellNullCheckException(){
if (!IsCellNullCheck()){
throw new OpenOfficeException("OpenOffice操作クラス例外:cellが選択されていません。");
}
}
#region IDisposable メンバ
/// <summary>クラス破棄時</summary>
public void Dispose(){
//OpenOffice閉じる
OpenOfficeClose();
//OpenOfficeのプロセス強制終了
OpenOfficeProcessKill();
}
#endregion
}
/// <summary>プロパティ設定・取得のための値を持つクラス。
/// Actionデリゲートでつかうるようにするため各型のを扱えるようにラップしたもの。 </summary>
class PropertiesDelegateParam{
private XPropertySet xPropSet;
private Color clrValue;
private double dValue;
private float fValue;
private int iValue;
private long lValue;
private string strValue;
private bool blValue;
private OpenOffice.ParagraphSide sideValue;
/// <summary>コンストラクタ。</summary>
/// <param name="xPropertySet">(XPropertySet)this.cell</param>
protected internal PropertiesDelegateParam(XPropertySet xPropertySet){
xPropSet = xPropertySet;
}
/// <summary>プロパティでカラー情報を設定・取得</summary>
protected internal Color ColorValue{
get { return clrValue; }
set { clrValue = value; }
}
/// <summary>プロパティで倍精度小数点を設定・取得</summary>
protected internal double DoubleValue{
get { return dValue; }
set { dValue = value; }
}
/// <summary>プロパティで単精度小数点を設定・取得</summary>
protected internal float FloatValue{
get { return fValue; }
set { fValue = value; }
}
/// <summary>プロパティで整数を設定・取得</summary>
protected internal int IntValue{
get { return iValue; }
set { iValue = value; }
}
/// <summary> プロパティで長整数を設定・取得 </summary>
protected internal long LongValue{
get { return lValue; }
set { lValue = value; }
}
/// <summary>プロパティで文字列を設定・取得</summary>
protected internal string StringValue{
get { return strValue; }
set { strValue = value; }
}
/// <summary>プロパティで真偽を設定・取得</summary>
protected internal bool BoolValue{
get { return blValue; }
set { blValue = value; }
}
/// <summary>プロパティで方向を設定・取得</summary>
protected internal OpenOffice.ParagraphSide SideValue{
get { return sideValue; }
set { sideValue = value; }
}
/// <summary>XPropertySetオブジェクトを取得</summary>
protected internal XPropertySet XPropertySet{
get { return xPropSet; }
}
}
/// <summary>このクラスの例外</summary>
class OpenOfficeException : System.Exception{
public OpenOfficeException(string message)
: base(message){
}
}
}