ツヨシのブログ

技術的な事とか日常の事とか徒然なるままに

C#でエクセルファイルを扱う方法の忘備録

はじめに

会社でとあるエクセルシートの内容を読み込み、他のデータと比べて新しいリストを作成する必要があったので、そのプログラムをC#で作りました。(4000個近くのデータを別のシートから抜き出し並べるものなのでとても手じゃできないと)VBSを使用したマクロを組んでも良かったかと思いますが、VBSについてはよくわからないので、今回はC#でプログラムを作成しました。その時の忘備録としてC#によるエクセルシート上のデータの取得方法について書いています。使用したC#はVisualStudio2008に付いているものです。

参照の追加

アプリケーションからエクセルにアクセスするには、エクセルが公開するCOMコンポーネントへの参照をプロジェクトに追加する必要があります。これには[参照の追加]ウィンドウで[COM]タブを選択し、「Microsoft Excel 12.0 Object Library」を追加します。これにより、ソリューション・エクスプローラの「参照設定」のツリーに「Microsoft.Office.Core」と「Microsoft.Office.Interop.Excel」が追加されます。使用するエクセルのバージョンにより選ぶライブラリが違うようですので、注意してください。

名前空間のインポート

追加したライブラリによりエクセルへのアクセスを行うために名前空間のインポートが必要になります。ソースの上の方に以下のコードを記入します。

using Excel = Microsoft.Office.Interop.Excel;

ファイルのオープン

使用するエクセルファイルのオープンを行います。オープンにはエクセルオブジェクト、ワークブックオブジェクトを指定してオープンします。オープンの際には適当なプロパティを設定します。

string excelName = "C:\\sample.xls";

Excel.Application oXls; //エクセルオブジェクト
Excel.Workbook oWBook; //ワークブックオブジェクト

oXls = new Excel.Application();
oXls.Visible = true; //確認のためエクセルのウィンドウを表示する

//エクセルファイルをオープンする
oWBook = (Excel.Workbook)(oXls.Workbooks.Open(
  excelName,  // オープンするExcelファイル名
  Type.Missing, // (省略可能)UpdateLinks (0 / 1 / 2 / 3)
  Type.Missing, // (省略可能)ReadOnly (True / False )
  Type.Missing, // (省略可能)Format
  // 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;)
  // 5:なし / 6:引数 Delimiterで指定された文字
  Type.Missing, // (省略可能)Password
  Type.Missing, // (省略可能)WriteResPassword
  Type.Missing, // (省略可能)IgnoreReadOnlyRecommended
  Type.Missing, // (省略可能)Origin
  Type.Missing, // (省略可能)Delimiter
  Type.Missing, // (省略可能)Editable
  Type.Missing, // (省略可能)Notify
  Type.Missing, // (省略可能)Converter
  Type.Missing, // (省略可能)AddToMru
  Type.Missing, // (省略可能)Local
  Type.Missing  // (省略可能)CorruptLoad
));

ワークシートの選択

使用するワークシートを選択します。ワークシートはインデックスによって指定しますので、ワークシート名からインデックスを取得して該当するワークシートオブジェクトを取得します。

// 指定されたワークシート名のインデックスを返すメソッド
private int getSheetIndex(string sheetName, Excel.Sheets shs)
{
  int i = 0;
  foreach (Excel.Worksheet sh in shs)
  {
    if (sheetName == sh.Name)
    {
      return i + 1;
    }
    i += 1;
  }
  return 0;
}

// 与えられたワークシート名から、ワークシートオブジェクトを得る
string sheetName = "Sheet2";
Excel.Worksheet oSheet; // ワークシートオブジェクト
oSheet = (Excel.Worksheet)oWBook.Sheets[getSheetIndex(sheetName, oWBook.Sheets)];

セルの内容を読み込む

ワークシートオブジェクトより目的とするセルの内容を読み込みます。セルで縦方向に並ぶの「列」がカラム(Column)で横方向に並ぶ「行」はロウ(Row)です。セルはワークシートオブジェクトのCells[row, col]により呼び出します。ちなみに、カラム、ロウ共に(0,0)からではなく(1,1)から始まります。

string sCellVal;
Excel.Range rng; // Rangeオブジェクト

rng = (Excel.Range)oSheet.Cells[1, 1];
sCellVal = rng.Text.ToString(); // A1セルの内容

終了処理

最後に終了処理です。ワークブックオブジェクトを閉じて終了です。

oWBook.Close(Type.Missing, Type.Missing, Type.Missing);
oXls.Quit();

最後に

こんなかんじでC#からエクセルシートについてアクセスすることができます。まあ、CSV形式にしてただのファイルとして扱ったほうが楽なのかもしれませんが、今回はエクセルとして扱ってみました。

独習C# 第3版

独習C# 第3版


プログラミングC# 第6版

プログラミングC# 第6版


猫でもわかるC#プログラミング 第2版 (猫でもわかるシリーズ)

猫でもわかるC#プログラミング 第2版 (猫でもわかるシリーズ)