以前、C#からExcelを開いたり、保存したりをご紹介しましたが……
「じゃあそれをどう読み書きするの?」
ということで今回は、読込みについてですー
はじめに
ここでご紹介した通り、まずはExcelのシートを開くところまでやります。
異常とかの処理は省いています。
参照の追加と……
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次元配列で取得できます。
なのでこんな感じになります。
参考
コチラを参考にしました。ありがとうございました!
Excelファイルから数値でセル番号を指定してセルの内容を取得する (C#プログラミング)
あとがき
ということでC#からExcelの値を読む方法でした!
そのうち値の書き込みについても、書こうと思ってますー