複数のExcelのバージョンに対応する ~遅延バインディング③~

その他の遅延バインディングを利用した読み込みと書き込み

開発環境
・Visual Studio 2019
・Excel 2019

操作ファイルの開始時点のイメージ

遅延バインディング②の書き込みまでで利用したファイルで検証しています。

最大行、最大列の取得

ヘッダの追加と、読み込み
oCells = oSheet.GetType().InvokeMember(“Cells”, BindingFlags.GetProperty, null, oSheet, null);
行までは同じなので省略します。

object oLastCell;
int MaxCol;
int MaxRow;

Params = new object[2];
Params[0] = 11;
Params[1] = Type.Missing;
oLastCell = oCells.GetType().InvokeMember("SpecialCells", BindingFlags.InvokeMethod, null, oCells, Params);  //最終セルの取得
MaxCol = (int)oLastCell.GetType().InvokeMember("Column", BindingFlags.GetProperty, null, oLastCell, null);   //最終セルの列番号を取得
MaxRow = (int)oLastCell.GetType().InvokeMember("Row", BindingFlags.GetProperty, null, oLastCell, null);      //最終セルの行番号を取得

MessageBox.Show("最大列数:" + MaxCol + Environment.NewLine + "最大行数:" + MaxRow);	//得られた結果の表示

結果表示

最大列として5列(E列)が取得でき、最大行として5行が取得できます。

罫線の追加

まずは下記をパラメータとして追加しておきます。

//罫線の種類
public enum XlLineStyle : int
{
    Normal = 1,
    Dash = -4115,
    DashDot = 4,
    DashDashDot = 5,
    Double = -4119,
    None = -4142,       
    SlashDashDot = 13
}

//罫線の太さ
public enum XlLineWeight : int
{
    Normal = 2,     //通常
    Medium = -4138, //太め
    Thick = 4,      //細め
    Thin = 1        //さらに細め
}

//罫線の描画位置
public enum XlDrawLine : int
{
    Tilt_UpperLeft = 5,     //セルの左上から右下に向かった斜線
    Tilt_UpperRight = 6,    //セルの右上から左下に向かった斜線
    Edge_Left = 7,          //セル枠左
    Edge_Top = 8,           //セル枠上
    Edge_Bottom = 9,        //セル枠下
    Edge_Right = 10,        //セル枠右
    Inside_Vertical = 11,   //枠を除くセルに縦線
    Inside_Horizon = 12     //枠を除くセルに横線
}

最大行列の取得と同じく、ヘッダの追加と、読み込み
oCells = oSheet.GetType().InvokeMember(“Cells”, BindingFlags.GetProperty, null, oSheet, null);
行までは同じなので省略します。

object oRange;
object oBorders = null;
object oBorder = null;
object[] oLineStyle = new object[1];
object[] oLineWeight = new object[1];
object[] oBorderLinePos = new object[1];

//A5からB6までの4セルに左上から右下への点斜線を入れる
oLineStyle[0] = XlLineStyle.Dash;       //点線を指定
oLineWeight[0] = XlLineWeight.Medium;   //太線を指定 ※斜線では適用されませんが、記述方法として書いておきます
oBorderLinePos[0] = XlDrawLine.Tilt_UpperLeft;

Params = new object[1];
Params[0] = "A5:B6";    //罫線を入れる範囲を指定
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);

oBorders = oRange.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null, oRange, null);
oBorder = oBorders.GetType().InvokeMember("_Default", BindingFlags.GetProperty, null, oBorders, oBorderLinePos);
oBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null, oBorder, oLineStyle);
oBorder.GetType().InvokeMember("Weight", BindingFlags.SetProperty, null, oBorder, oLineWeight);  //斜線では適用されませんが、記述方法として書いておきます ※この場合、枠線を描く場合は太線で描画されます。


//D5とD6の中に二重線(横線)を入れる
oLineStyle[0] = XlLineStyle.Double;
oLineWeight[0] = XlLineWeight.Thin;  //二重線なのでこの場合、指定しても無意味です。
oBorderLinePos[0] = XlDrawLine.Inside_Horizon;

Params = new object[1];
Params[0] = "D5:D6";    //罫線を入れる範囲を指定
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);

oBorders = oRange.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null, oRange, null);
oBorder = oBorders.GetType().InvokeMember("_Default", BindingFlags.GetProperty, null, oBorders, oBorderLinePos);
oBorder.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null, oBorder, oLineStyle);
//罫線なし、二重線は罫線の太さを指定できない
if ((XlLineStyle)oLineStyle[0] != XlLineStyle.None && (XlLineStyle)oLineStyle[0] != XlLineStyle.Double)
    oBorder.GetType().InvokeMember("Weight", BindingFlags.SetProperty, null, oBorder, oLineWeight);

//解放処理
Marshal.ReleaseComObject(oBorder);
oBorder = null;
Marshal.ReleaseComObject(oBorders);
oBorders = null;

結果

上図のようにA5からB6に点線斜線、D5とD6の間に二重線(横線)が描画されます。

このように最大行列取得と罫線も遅延バインディングで取得することができます。

※このページに書かれているソースコードはご自由にご利用していただいて問題ありませんが、各自の責任でお願いします。問題や不利益等が発生したとしても当サイトは関知しません。

< 書き込み編へ

まとめへ >

 複数のExcelのバージョンに対応する ~遅延バインディング①~
 複数のExcelのバージョンに対応する ~遅延バインディング②~
 複数のExcelのバージョンに対応する ~遅延バインディング③~ このページ
 複数のExcelのバージョンに対応する ~遅延バインディングまとめ~

投稿日:2020年1月22日 更新日:

執筆者:

このサイトの管理者について

1980年代生まれ
石川県在住

メーカー2社経験後に退社

1年程度自由に在職中はできなかったことにチャレンジ

その後コロナの影響でなかなか仕事が見つかりませんでしたが、無事就職

現在はシステム会社に勤務中

PAGE TOP