lisz-works

技術と興味の集合体

C#でExcel読み書き!

【スポンサーリンク】

ソースコード

以前、C#からExcelを開いたり、保存したりをご紹介しましたが……

www.lisz-works.com

「じゃあそれをどう読み書きするの?」

ということで今回は、読込みについてですー

はじめに

ここでご紹介した通り、まずはExcelのシートを開くところまでやります。

www.lisz-works.com

異常とかの処理は省いています。

usingの追加と……

using Microsoft.Office.Interop.Excel;

クラスメンバ作成とセットです。

これと

private Microsoft.Office.Interop.Excel.Application xls = null;     // Excel自体 
private Microsoft.Office.Interop.Excel.Workbook book = null;       // ブック 
private Microsoft.Office.Interop.Excel.Worksheet sheet = null;     // シート

これ

this.xls = new Microsoft.Office.Interop.Excel.Application();
ExcelVisibleToggle(xls, false);     // Excelを非表示:レスポンス向上
this.book = xls.Workbooks.Open(@"C:\work\test.xlsx");  // 既存ファイルオープン
this.sheet = (Microsoft.Office.Interop.Excel.Worksheet)this.book.Sheets[sheetName];
ExcelVisibleToggle(xls, true);      // Excel表示

読込みサンプルロジック

今回は確認用にこんなExcelを作りました。

サンプルの表

で、作ったロジックはこんな感じ。

int row = 1;
int col = 1;
int width = 4;
int height = 4;
int rangeW = col + width - 1;
int rangeH = row + height - 1;
Range range = this.sheet.Range[this.sheet.Cells[row, col], this.sheet.Cells[rangeH, rangeW]];

// 開始idx=1なので注意
string str = "";
for ( int r = 1; r < height + 1; r++ )
{
    for ( int c = 1; c < width + 1; c++ )
    {
        dynamic val = range.Value2[r, c];
        str += Convert.ToString(val) + ", ";
    }
    str += "\r\n";
    Console.WriteLine(str);
}

実行すると感じで出力されます。

1, 2, 3, 4, 
5, 6, 7, 8, 
9, 10, 11, 12, 
13, 14, 15, 16, 

RangeとValue2

セルの読込を行う場合、まず範囲を取得します。

これでRangeオブジェクトを取得します。

Range range = this.sheet.Range[this.sheet.Cells[row, col], this.sheet.Cells[rangeH, rangeW]];

シートのRange[]に、Cellsを渡すことで、Rangeオブジェクトを取得することができます。

Cells

CellsはExcelでいう、セルを指定するのと同じような意味合いを持ちます。

sheet.Cells[row, col]

と、指定したい行列番号をセットします。

例えば、Excelで「C2セル」を選択した場合、「row(行):2、col(列):3」ですよね。
ということは

sheet.Cells[2, 3]

と指定します。

Rangeの取得

Rangeは、Cellsを2つ指定することで「ココからココまで」という範囲を表すオブジェクトを取得します。

sheet.Range[範囲開始セル, 範囲終了セル];

のように指定します。

なので例えば、Excelでいうところの「B2~C4セル」を選択したいとします。
その場合

//                 B2        ,       C4
sheet.Range[sheet.Cells[2, 2], sheet.Cells[4, 3]];

のように指定します。

そうすることで、「B2~C4セル」を指定した、Rangeオブジェクトを取得することができます。

ちなみに「get_Rage()」というものを使用している例が、検索していると見かけるのですが、現在はRangeプロパティを使用するのがよいようです。
コチラは、2011年のスレッドですが、この時点で、get_Range()は非推奨でRangeプロパティの方がよいとの記載がありました。

Rangeから値を取る

値を取るには、取得したRangeの「Value2」にアクセスすればOK!

range.Value2[i, j];

Value2には、取得した範囲の値が、2次元配列で取得できます。

なのでこんな感じになります。

2次元配列 対応

参考

コチラを参考にしました。ありがとうございました!

Excelファイルから数値でセル番号を指定してセルの内容を取得する (C#プログラミング)

あとがき

ということでC#からExcelの値を読む方法でした!

そのうち値の書き込みについても、書こうと思ってますー