注目の記事 PICK UP!

  • C#

C# DataTableにExcelを読み込む

ExcelをDataTableに読み込むクラスを作成しました。

 

スポンサーリンク

 

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Microsoft.Office.Interop.Excel;

namespace Sample
{
    class Excel
    {
        /// <summary>
        /// Excel データをDataTableに格納します
        /// </summary>
    /// <param name="path">Excel格納ディレクトリ</param>
        /// <param name="name">Excelファイル名称</param>
        /// <return>読み込んだExcelデータ</return>
        public System.Data.DataTable ExcelReader(string path, string name)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            // Excelオブジェクトを生成
            Application ExcelApp = new Application();
            try
            {
                // ウィンドウは非表示
                ExcelApp.Visible = false;
                // エクセルオープン
                Workbook WorkBook = ExcelApp.Workbooks.Open(path + name);
                //1シート目の選択
                Worksheet sheet = WorkBook.Sheets[1];
                sheet.Select();

                // 最大行数
                int Maxrow = sheet.get_Range("A1").End[XlDirection.xlDown].Row;
                // 最大列数
                int Maxcol = sheet.UsedRange.Columns.Count;

                for (int i = 0; i < Maxcol; i++)
                {
                    //カラム名にダミーを設定します。
                    dt.Columns.Add("ダミー" + i);
                }

                for (int col = 0; col < Maxcol; col++ )
                {
                    Range rg = sheet.Cells[1, col + 1];
                    dt.Columns[col].ColumnName = rg.Value2;
                }

                Range Excel_data = sheet.get_Range("A2", Type.Missing).get_Resize(Maxrow, Maxcol);
                for (int row = 2; row <= Maxrow; row++)
                {
                    DataRow dr = dt.NewRow();
                    for (int col = 1; col <= Maxcol; col++)
                    {
                        Excel_data = sheet.Cells[row, col];
                        dr[dt.Columns[col - 1].ColumnName] = Excel_data.Value2;
                    }
                    dt.Rows.Add(dr);
                }

                //workbookを閉じる
                WorkBook.Close();
                //エクセルを閉じる
                ExcelApp.Quit();
                // COMの解放
                System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
            }
            catch (Exception ex)
            {
                Console.Write("Excelファイルを読み込めませんでした。");
                //エクセルを閉じる
                ExcelApp.Quit();
            }
            return dt;
        }
    }
}

アセンブリ参照

Microsoft Excel 14.0 Object Libraryを参照設定後、using Microsoft.Office.Interop.Excel;を追加します。

Excelオブジェクトの生成

23行目でExcelオブジェクトを生成後、プロパティを設定しています。

読み込む最大行数と最大列数を設定

35行目と37行目で読み込み対象(Excel)の行数と列数の最大値を取得します。

カラム名にダミーを設定

39行目のfor文でダミーのカラム名を設定しています。この処理を実施しないとExcelファイルのデータをDataTableに取り込めません。

カラム名を設定

45行目のfor文は、Excelファイルの1行目を項目名(赤枠)として扱っています。

エクセルの1行目に項目名が定義されていない場合、コメントアウトしてください。

エクセル

 

レコード挿入

51行目で取得する範囲(get_Range)を設定しています。”A2“としているのは、1行目を項目名としているためです。項目名がない場合、”A1“と変更してください。

52行目から1行ずつDataTableにNewRow(レコード挿入)しています。もし、エクセルの1行目に項目名がない場合、52行目のfor文を下記のように修正してください。

修正前:for (int row = 2; row <= Maxrow; row++)
修正後:for (int row = 1; row <= Maxrow; row++)

スポンサーリンク

  • コメント: 57

関連記事

  1. C# チャートデータからローソク足を描画する方法

  2. C# DataTableの特定データを更新

  3. C# ファイルダイアログからテキストを読み込む方法

  4. C# LINQを使って重複行をGroup byする方法

  5. C# DataTableをコピーする

  6. C# LINQを使ってDataTableを並び替える

  7. C# DataTableの特定レコードを削除

  8. C# JSONファイルからLINQを使って集計する方法 – 勝率の算出

  9. C# DataTableのカラム名を変更

コメント

    • Johnk391
    • 2015年 10月 17日

    I appreciate, cause I found just what I was looking for. You have ended my 4 day long hunt! God Bless you man. Have a nice day. Bye dkabdekdfgkf

    • Johnb831
    • 2015年 10月 17日

    I like the helpful information you provide in your articles. Ill bookmark your weblog and check again here regularly. I’m quite certain I will learn plenty of new stuff right here! Good luck for the next! fecgfekckdeb

    • big dildos
    • 2016年 5月 16日

    irp5v5 You ave made some good points there. I checked on the net to find out more about the issue and found most individuals will go along with your views on this web site.

    • Smithe493
    • 2016年 9月 27日

    You made some really good points there. I checked on the internet for additional information about the issue and found most people will go along with your views on this site. gfddkcgcgdckbfak

  1. この記事へのトラックバックはありません。

PAGE TOP