C#でExcelファイルの読み込み

Excelからデータを読み込むコマンドラインプログラムを書いてみた。

こういうExcelファイルを読み込んで、

時間数値
2009/2/281
2009/3/12
2009/3/23
2009/3/34
そのまま出力するだけ。

>> DumpExcel.exe sample.xls Sheet1 2 5
時間	数値
2009/2/28	1
2009/3/1		2
2009/3/2		3
2009/3/3		4

カラム数、行数を引数で指定するのが非常にイケてない。
ちゃんとしたクラス化も含めて全面改装予定。


事前に参照の追加を行ってください。
参照設定→参照の追加→COM→Microsoft Excel 11.0 Object Library(Excel2003の場合)

using System;
using System.Collections.Generic;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelCli {
  class Program {
    static void Main(string[] args) {
      if (args.Length != 4) {
        usage();
        Environment.Exit(1);
      }

      string excelName = args[0];
      string sheetName = args[1];
      int nCol = int.Parse(args[2]);
      int nRow = int.Parse(args[3]);

      Excel.Application oXls;
      Excel.Workbook oWBook;
      Excel.Worksheet oSheet;


      oXls = new Excel.Application();
      //oXls.Visible = true;

      oWBook = (Excel.Workbook)(oXls.Workbooks.Open(
          excelName,
          Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
          Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
          Type.Missing, Type.Missing, Type.Missing, Type.Missing
      ));

      oSheet = (Excel.Worksheet)oWBook.Sheets[getSheetIndex(sheetName, oWBook.Sheets)];


      Excel.Range rng = oSheet.get_Range("A1", Type.Missing).get_Resize(nRow, nCol);
      for (int i = 0; i < nRow; i++) {
        string[] row = new string[nCol];
        for (int j = 0; j < nCol; j++) {
          rng = (Excel.Range)oSheet.Cells[i + 1, j + 1];
          row[j] = rng.Text.ToString();
        }

        Console.WriteLine(string.Join("\t", row));
      }


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

    private static int getSheetIndex(string sheetName, Excel.Sheets shs) {
      int i = 1;
      foreach (Excel.Worksheet sh in shs) {
        if (sheetName == sh.Name)
          return i;

        i++;
      }
      return 0;
    }

    static void usage() {
      Console.WriteLine("Usage: DumpExcel.exe filename sheetname nCol nRow");
    }
  }
}