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

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)C#からExcelへの遅延バインディングで、罫線を引く

(.Net)C#から遅延バインディングでExcelファイルに読み書きするで、C#からExcelへ遅延バインディングを使ったアクセスを書きましたが、今回はセルの罫線を引く方法です。

流れとして、Range インスタンスから Borders を取得し、そこから Border(どこの線か)を取得し、Borderの LineStyle に線種を設定するような形になります。

例えば、B9:E15の範囲のすべての縦横に実線で引く(格子状)には、こんな感じにします。
(シートオブジェクトまでは生成していることとします。)

//oSheetはシートオブジェクト
object oRange=null;

object targetBorders = null;
object targetBorder = null;


//罫線を引くRangeを指定
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
    , oSheet, new object[] { "B9:E15", Missing.Value });

//罫線達を取得。
targetBorders = oRange.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null
    , oRange, new object[] { });

//Rangeの上の罫線オブジェクト取得
targetBorder = targetBorders.GetType().InvokeMember("Item", BindingFlags.GetProperty, null
    , targetBorders, new object[] { 8 });
//罫線描画(実線)
targetBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null
    , targetBorder, new object[] { 1 });

//Rangeの右の罫線オブジェクト取得
targetBorder = targetBorders.GetType().InvokeMember("Item", BindingFlags.GetProperty, null
    , targetBorders, new object[] { 10 });
//罫線描画(実線)
targetBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null
    , targetBorder, new object[] { 1 });

//Rangeの左の罫線オブジェクト取得
targetBorder = targetBorders.GetType().InvokeMember("Item", BindingFlags.GetProperty, null
    , targetBorders, new object[] { 7 });
//罫線描画(実線)
targetBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null
    , targetBorder, new object[] { 1 });

//Rangeの下の罫線オブジェクト取得
targetBorder = targetBorders.GetType().InvokeMember("Item", BindingFlags.GetProperty, null
    , targetBorders, new object[] { 9 });
//罫線描画(実線)
targetBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null
    , targetBorder, new object[] { 1 });

//Rangeの内側の横の罫線オブジェクト取得
targetBorder = targetBorders.GetType().InvokeMember("Item", BindingFlags.GetProperty, null
    , targetBorders, new object[] { 12 });
//罫線描画(実線)
targetBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null
    , targetBorder, new object[] { 1 });

//Rangeの内側の縦の罫線オブジェクト取得
targetBorder = targetBorders.GetType().InvokeMember("Item", BindingFlags.GetProperty, null
    , targetBorders, new object[] { 11 });
//罫線描画(実線)
targetBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null
    , targetBorder, new object[] { 1 });

Borders.Item から Border を取得する引数部分で、罫線の位置を指定します。 罫線の位置の指定には、以下の定数が使えます。

値   定数              内容
5    xlDiagonalDown     セルに右下がりの斜線 (対角線)
6    xlDiagonalUp       セルに右上がりの斜線 (対角線)
9    xlEdgeBottom       セルの下の線
7    xlEdgeLeft         セルの左の線
10   xlEdgeRight        セルの右の線
8    xlEdgeTop          セルの上の線
12   xlInsideHorizontal セル範囲の内側の横線
11   xlInsideVertical   セル範囲の内側の縦線

また、LineStyle で線種を指定するわけですが、これは以下の定数が使えます。

値      定数            内容
1       xlContinuous    実線
-4115   xlDash          破線
4       xlDashDot       一点鎖線
5       xlDashDotDot    二点鎖線
-4118   xlDot           点線
-4119   xlDouble        二重線
13      xlSlantDashDot  斜め一点鎖線
-4142   xlLineStyleNone 線なし

targetBorders , targetBorder も忘れずに Marshal.FinalReleaseComObject() で、COM参照を解放してやるようにしましょう。

参考:
【VB.NET】VB.NET から Excel の COM オブジェクトを制御する基本セット - TimberLandChapel
Excel #A013 ≪罫線関連マクロ&罫線関連定数≫(各定数の値が載っています)
C# Excel操作覚え書き