ADO.NET C#で エクセルファイル(xls)を読み込む

C#でエクセルファイルを読み込む場合の参考ソース。Jet OLE DBプロバイダを使用するのが一般的なようです。

        String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=" + Server.MapPath(filePath) + ";" +
            "Extended Properties=\"Excel 8.0;\"";
        OleDbConnection objConn = new OleDbConnection(sConnectionString);
        objConn.Open();
        OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM ItemMaster", objConn);
        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
        objAdapter1.SelectCommand = objCmdSelect;
        DataSet objDataset1 = new DataSet();
        objAdapter1.Fill(objDataset1, "XLData");

ただ、現在のバージョンでは注意が必要です。

データ型について

従来のデータベースとは異なり、Excel テーブルの列に直接データ型を指定する方法はありません。OLE DB プロバイダが列内の 8 行をスキャンして、そのフィールドのデータ型を推測します。スキャンする行数は、接続文字列の拡張プロパティで、MAXSCANROWS の設定に 1 ~ 16 の値を指定することで変更できます。

だそうです。自動で「数値型」と認識された列に、文字列が入り込んでいる場合、なんと!「データなし」とされてしまいます。

ならば、データ型の推測対象をヘッダ行のみにすれば、すべて文字列型として認識されるはず。

Extended Properties="Excel8.0;HDR=NO;MAXSCANROWS=1;"

結果は同じでしたorz.. MAXSCANROWS 効かない。。。セルの書式設定を「文字列」にしてもやっぱり、数字のみで文字列を読み込みません。

別角度の対策が必要そうです。