C#でエクセルからデータを取得する方法を解説します。
データの取得はエクセルを自動で操作するための基礎となります。
ExcelDataReaderの取得
まずはエクセルを読み込むための準備としてExcelDataReaderを取得します。
以下のように「ツール(T)」から「ソリューションのNuGetパッケージの管理(N)」をクリックし、NuGetの管理画面を開きます。

次に、ExcelDataReaderと検索し、ExcelDataReaderとExcelDataReader.DataSetをインストールしましょう。

2つがインストールできれば準備は完了です。
コード
コードは以下になります。
private DataTable GetExcelDataBySheetName(string filepath, string sheetname)
{
using (FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var streamReader = new StreamReader(stream))
{
IExcelDataReader reader;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
if (filepath.EndsWith(".xls") || filepath.EndsWith(".xlsx") || filepath.EndsWith(".xlsb"))
{
reader = ExcelReaderFactory.CreateReader(streamReader.BaseStream, new ExcelReaderConfiguration()
{
FallbackEncoding = Encoding.GetEncoding("Shift_JIS")
});
}
else if (filepath.EndsWith(".csv"))
{
reader = ExcelReaderFactory.CreateCsvReader(streamReader.BaseStream, new ExcelReaderConfiguration()
{
FallbackEncoding = Encoding.GetEncoding("Shift_JIS")
});
}
else
{
MessageBox.Show("サポート対象外の拡張子です。");
return null;
}
var dataset = reader.AsDataSet();
var worksheet = dataset.Tables[sheetname];
reader.Close();
return worksheet;
}
}
コードの解説
エクセルからデータを取得するコードをGetExcelDataBySheetNameメソッドとしてまとめています。
処理としては、エクセルから1シート分のデータをテーブル形式で取得します。
まず引数のfilepathでエクセルのパスを、sheetnameで取得したいシート名を指定します。
4行目から指定したエクセルファイルの読み取りを開始します。
7行目に関しては、.Netを使っている場合はエンコード関係の処理で必要となります。
おまじないと思ってもらって大丈夫です。
.Net Frameworkを使っている場合は不要です。
次に、エクセル形式の場合は9行目の if に入り、csv形式の場合は16行目の else if に入ります。
それ以外の場合は23行目の else に入り、サポートしていない形式としてnullを返します。
エクセル形式とcsv形式どちらの場合も日本語に対応するためエンコードでShift_JISを指定します。
エクセル形式の場合は11行目、csv形式の場合は18行目で指定しています。
エンコードが指定できたら29行目でデータを取得します。
取得したデータにはエクセルの全シートの情報が含まれているため、30行目で取得したいシートを指定し、worksheetという変数に保持しています。
最後にworksheetを返して終了です。
これで指定したシートのデータをテーブル形式で取得できます。
最後に & 関連書籍
以上になります。
分かりにくいところや、「もっとこうしてほしい」などのご意見がありましたら、ツイッターから連絡いただけると幸いです。
質問に関しても、お気軽にお問い合わせください。
余談ですが、インスタグラムを自動でいいねするコードなども公開しています。
興味があれば見てみてください。
以下は関連書籍です。
コメント