C#でエクセルのデータをテーブル形式で取得する 自動化の基礎

C#でエクセルからデータを取得する方法を解説します。
データの取得はエクセルを自動で操作するための基礎となります。

ExcelDataReaderの取得

まずはエクセルを読み込むための準備としてExcelDataReaderを取得します。
以下のように「ツール(T)」から「ソリューションのNuGetパッケージの管理(N)」をクリックし、NuGetの管理画面を開きます。

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を返して終了です。
これで指定したシートのデータをテーブル形式で取得できます。

最後に & 関連書籍

以上になります。

分かりにくいところや、「もっとこうしてほしい」などのご意見がありましたら、ツイッターから連絡いただけると幸いです。
質問に関しても、お気軽にお問い合わせください。

余談ですが、インスタグラムを自動でいいねするコードなども公開しています。
興味があれば見てみてください。

以下は関連書籍です。

コメント

タイトルとURLをコピーしました