.net でのエクセル読み込み

エクセルを読み込む。(未テスト)

Openで全部の引数指定とかめんどいからクラス作ってみた。
ついでなんでちょっと機能拡張。

まずは参照設定。
COM のタグから。
Microsoft Excel 11.0 Object Library


WorkbookHelper

/// <summary>
/// ワークブックを簡易に扱えるラップを提供します。
/// </summary>
/// <summary>
/// ワークブックを簡易に扱える機能を提供します。
/// </summary>
public class WorkbookHelper : IDisposable {
  /// <summary>
  /// ワークブックを取得します。
  /// </summary>
  public Workbook Workbook { get; private set; }

  private readonly _Application _excelApplication;

  /// <summary>
  /// ファイル内のリンクの更新方法を指定します。この引数を省略すると、リンクの更新方法の指定を促すダイアログ ボックスが表示されます。
  /// </summary>
  public UpdateLinkType? UpdateLinks { get; set; }
  /// <summary>
  /// ブックを読み取り専用モードで開くには、True を指定します。
  /// </summary>
  public bool ReadOnly { get; set; }
  /// <summary>
  /// Microsoft Excel がテキスト ファイルを開くときに、この引数に項目の区切り文字を指定します。この引数を省略すると、現在指定されている区切り文字が使われます。
  /// </summary>
  public FormatType? Format { get; set; }
  /// <summary>
  /// パスワード保護されたブックを開くために必要なパスワードを指定します。パスワードが必要なときにこの引数を省略すると、パスワードの入力を促すダイアログ ボックスが表示されます。
  /// </summary>
  public string Password { get; set; }
  /// <summary>
  /// 書き込み保護されたブックに書き込みをするために必要なパスワードを指定します。パスワードが必要なときにこの引数を省略すると、パスワードの入力を促すダイアログ ボックスが表示されます。
  /// </summary>
  public string WriteResPassword { get; set; }
  /// <summary>
  /// [読み取り専用を推奨する] チェック ボックスをオンにして保存されたブックを開くときでも、読み取り専用を推奨するメッセージを非表示にするには、True を指定します。
  /// </summary>
  public bool IgnoreReadOnlyRecommended { get; set; }
  /// <summary>
  /// 指定したファイルがテキスト ファイルのときに、それがどのような形式のテキスト ファイルかを指定します。コード ページと CR/LF を正しく変換するために必要です。
  /// 使用できる定数は、 XlPlatform 列挙型の xlMacintosh、xlWindows、xlMSDOS のいずれかです。この引数を省略すると、現在のオペレーティング システムの形式が使われます。
  /// </summary>
  public XlPlatform? Origin { get; set; }
  /// <summary>
  /// 指定したファイルがテキスト ファイルであり、Format に CustomCharacter が設定されているときに、区切り記号として使う文字を指定します。
  /// </summary>
  public char Delimiter { get; set; }
  /// <summary>
  /// 指定したファイルが Microsoft Excel 4.0 のアドインの場合、この引数に True を指定すると、アドインをウィンドウとして表示します。この引数に False を指定するか省略すると、アドインは非表示の状態で開かれ、ウィンドウとして表示することはできません。この引数は、Microsoft Excel 5.0 以降のアドインには適用されません。指定したファイルが Excel のテンプレートの場合、True を指定すると、指定されたテンプレートを編集用に開きます。False を指定すると、指定されたテンプレートを基にした、新しいブックを開きます。既定値は False です。
  /// </summary>
  public bool Editable { get; set; }
  /// <summary>
  /// 指定したファイルが読み取り/書き込みモードで開けない場合に、ファイルを通知リストに追加するには、True を指定します。ファイルは読み取り専用モードで開かれて通知リストに追加され、ブックを編集できる状態になった時点で、ユーザーにその旨が通知されます。ファイルが開けない場合に、このような通知を行わずにエラーを発生させるには、False を指定するか省略します。
  /// </summary>
  public bool Notify { get; set; }
  /// <summary>
  /// ファイルを開くときに、最初に使うファイル コンバータのインデックス番号を指定します。指定したファイル コンバータでファイルを変換できない場合は、他のすべてのファイル コンバータでの変換が試みられます。指定するインデックス番号は、 FileConverters プロパティで取得されるファイル コンバータの行番号です。
  /// </summary>
  public int Converter { get; set; }
  /// <summary>
  /// True を設定すると、最近使用したファイルの一覧にこのブックが追加されます。既定値は False です。
  /// </summary>
  public bool AddToMru { get; set; }
  /// <summary>
  /// True を設定すると、Microsoft Excel で使用されている言語でファイルが保存されます (コントロール パネルの設定を含む)。False (既定値) を設定すると、VBA (Visual Basic for Applications) で使用されている言語でファイルが保存されます (通常はアメリカ英語です。ただし、古い国際版の XL5/95 VBA プロジェクトから Workbooks.Open を実行している場合を除きます)。
  /// </summary>
  public bool Local { get; set; }
  /// <summary>
  /// この引数を省略したときの既定の動作は、標準の読み込み処理となるのが普通ですが、2 回目以降はセーフ ロードやデータ リカバリとなることがあります。つまり、最初は標準の読み込み処理を試みます。ファイルを開いている途中で処理が停止したときは、次にセーフ ロードを試みます。再び処理が停止したときは、次にデータ リカバリを試みます。
  /// </summary>
  public XlCorruptLoad? CorruptLoad { get; set; }

  /// <summary>
  /// WorkbookWrap クラスの新しいインスタンスを初期化します。
  /// </summary>
  public WorkbookHelper()
    : this( new Application() ) {
  }

  /// <summary>
  /// WorkbookWrap クラスの新しいインスタンスを初期化します。
  /// </summary>
  /// <param name="excelApplication">開くブックのエクセルアプリケーションを指定します。</param>
  public WorkbookHelper( _Application excelApplication ) {
    Local = true;
    ReadOnly = true;
    IgnoreReadOnlyRecommended = true;
    _excelApplication = excelApplication;
  }

  static object GetValueWrap( object value ) {
    return value ?? Type.Missing;
  }

  /// <summary>
  /// シートを取得します。
  /// </summary>
  /// <param name="sheetName">シート名。</param>
  /// <returns>取得された Worksheet。</returns>
  public Worksheet this[string sheetName] {
    get {
      if (Workbook == null) {
        throw new InvalidOperationException( "Workbook が開かれていません。" );
      }

      return GetSheet( Workbook, sheetName );
    }
  }

  /// <summary>
  /// シートを取得します。
  /// </summary>
  /// <param name="sheetIndex">シートインデックス。</param>
  /// <returns>取得された Worksheet。</returns>
  /// <remarks>インデックスは 1 から開始されます。</remarks>
  public Worksheet this[int sheetIndex] {
    get {
      if (sheetIndex == 0) {
        throw new ArgumentOutOfRangeException( "sheetIndex", sheetIndex, "インデックスは 1 から開始されます。" );
      }

      if (Workbook == null) {
        throw new InvalidOperationException( "Workbook が開かれていません。" );
      }

      return (Worksheet)Workbook.Sheets[sheetIndex];
    }
  }

  /// <summary>
  /// シートの数を取得します。
  /// </summary>
  public int Count {
    get {
      if (Workbook == null) {
        throw new InvalidOperationException( "Workbook が開かれていません。" );
      }

      return Workbook.Sheets.Count;
    }
  }

  /// <summary>
  /// ブックを開きます。
  /// </summary>
  /// <param name="excelPath">開くブックのファイル名を指定します。</param>
  /// <returns>開かれた Workbook。</returns>
  /// <remarks>既定では、プログラムからファイルを開くときにマクロが有効になります。ファイルをプログラムから開くときに使用するマクロのセキュリティ レベルを設定するには、 Application.AutomationSecurity プロパティを使用します。</remarks>
  public Workbook OpenWorkbook( string excelPath ) {
    if (_excelApplication.Workbooks.Count == 0) {
      _excelApplication.Workbooks.Add( new Workbook() );
      _excelApplication.Save( excelPath );
    }

    Workbook = _excelApplication.Workbooks.Open(
      excelPath, GetValueWrap( UpdateLinks ), GetValueWrap( ReadOnly ), GetValueWrap( Format )
      , GetValueWrap( Password ), GetValueWrap( WriteResPassword )
      , GetValueWrap( IgnoreReadOnlyRecommended ), GetValueWrap( Origin ), GetValueWrap( Delimiter )
      , GetValueWrap( Editable ), GetValueWrap( Notify ), GetValueWrap( Converter )
      , GetValueWrap( AddToMru ), GetValueWrap( Local ), GetValueWrap( CorruptLoad )
    );
    return Workbook;
  }

  /// <summary>
  /// インスタンスを作成せずに Workbook を取得します。
  /// </summary>
  static public Workbook GetWorkbook( string fileName ) {
    WorkbookHelper helper = new WorkbookHelper();
    return helper.OpenWorkbook( fileName );
  }

  /// <summary>
  /// インスタンスを作成せずに Worksheet を取得します。
  /// </summary>
  /// <param name="workbook">シートを保持している Workbook。</param>
  /// <param name="sheetName">取得するシートの名称。</param>
  /// <returns>取得された Worksheet。</returns>
  static internal Worksheet GetSheet( Workbook workbook, string sheetName ) {
    foreach (Worksheet sheet in workbook.Sheets) {
      if (sheetName == sheet.Name) {
        return sheet;
      }
    }
    return null;
  }

  /// <summary>
  /// インスタンスを作成せずに Worksheet を取得します。
  /// </summary>
  /// <param name="workbook">シートを保持している Workbook。</param>
  /// <param name="sheetIndex">取得するシートのインデックス。</param>
  /// <returns>取得された Worksheet。</returns>
  /// <remarks>インデックスは 1 から開始されます。</remarks>
  static internal Worksheet GetSheet( Workbook workbook, int sheetIndex ) {
    if (sheetIndex == 0) {
      throw new ArgumentOutOfRangeException( "sheetIndex", sheetIndex, "インデックスは 1 から開始されます。" );
    }

    return (Worksheet)workbook.Sheets[sheetIndex];
  }

  #region Dispose pattern
  /// <summary>
  /// リソースが解放されているかどうかを示します。
  /// </summary>
  bool _disposed;

  /// <summary>
  /// WorkbookHelper で使用されるすべてのリソースを解放します。
  /// </summary>
  public void Dispose() {
    GC.SuppressFinalize( this );
    Dispose( true );
  }

  /// <summary>
  /// WorkbookHelper によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。
  /// </summary>
  /// <param name="disposing">マネージ リソースとアンマネージ リソースの両方を解放する場合は true。アンマネージ リソースだけを解放する場合は false。</param>
  protected virtual void Dispose( bool disposing ) {
    if (_disposed) {
      return;
    }
    _disposed = true;

    if (disposing && _excelApplication != null) {
      if (_excelApplication.Workbooks != null) {
        _excelApplication.Workbooks.Close();
      }
      _excelApplication.Quit();
    }
  }

  ~WorkbookHelper() {
    Dispose( false );
  }
  #endregion
}

UpdateLinkType

/// <summary>
/// ファイル内のリンクの更新方法を指定します。
/// </summary>
public enum UpdateLinkType {
	/// <summary>
	/// User specifies how links will be updated
	/// </summary>
	UserSpecifies = 1,
	/// <summary>
	/// Never update links for this workbook on opening
	/// </summary>
	NeverUpdate = 2,
	/// <summary>
	/// Always update links for this workbook on opening
	/// </summary>
	AlwaysUpdate = 3,
}

FormatType

/// <summary>
/// 区切り文字のフォーマットを指定します。
/// </summary>
public enum FormatType {
	/// <summary>
	/// タブを示します。
	/// </summary>
	Tabs = 1,
	/// <summary>
	/// カンマを示します。
	/// </summary>
	Commas = 2,
	/// <summary>
	/// スペースを示します。
	/// </summary>
	Spaces = 3,
	/// <summary>
	/// セミコロンを示します。
	/// </summary>
	Semicolons = 4,
	/// <summary>
	/// なしを示します。
	/// </summary>
	Nothing = 5,
	/// <summary>
	/// WorkbookOpener.Delimiter プロパティで指定された文字を示します。
	/// </summary>
	CustomCharacter = 6,
}

あとは、シートのCells[1,1]とかで値が取れるんじゃないかと妄想

追記
注意点
Excel Com オブジェクトの扱いがめんどくさい点。 - Memo+