SEの転職活動で使うべきサイト・エージェント 目指せ年収アップ
SEの転職活動で使うべきサイト・エージェント 目指せ年収アップ
東南アジアをバックパッカーしながら転職活動をした記録
東南アジアをバックパッカーしながら転職活動をした記録
7年目で初の転職活動 2カ月で内定獲得した記録
7年目で初の転職活動 2カ月で内定獲得した記録
おすすめのプログラミングスクール めざせ就職・年収アップ!
おすすめのプログラミングスクール めざせ就職・年収アップ!
メンズクリア2年通い放題入会! その後のヒゲ状況(不定期更新)
メンズクリア2年通い放題入会! その後のヒゲ状況(不定期更新)
ブログ開始3年が経った月収が1万超えてた!
ブログ開始3年が経った月収が1万超えてた!
プログラミング独学・スクール・就職(目次)
プログラミング独学・スクール・就職(目次)
previous arrowprevious arrow
next arrownext arrow
 
Shadow
C#/VB.net

C# エクセルを開かずにDatatbleに取込み(Closed XML)

エクセルをC#で処理するときにMicrosoft.Office.Interop.Excelを参照追加して処理することが今のところは主流です。

C# エクセルをDatatble,Datagridviewに取込み(複数シート) C#でエクセルをdatatableに取込むことはたまにあると思います。 備忘録として残しておきます。 実際に作ったフ...

ここで面倒なことがあります。

プロセスが残らないよう制御が面倒です。

いちいちエクセルを開くので時間がかかる

Excel(Office)がインストールされていない端末では使えない

ということで、エクセルを開かず、読込む方法を紹介します。

デモンストレーションで動かした動画を載せておきます。

officeがインストールされていない端末でデモをしています。

Closed XMLの参照設定追加

ClosedXMLで参照追加が必要です。

手順は以下の通りです。

パッケージマネージャコンソールを開く

「ツール」→「NuGetパッケージマネージャ」→「パッケージマネージャコンソール」の順で開きます。

インストール実行

その後、Install-Packageコマンドを実行して完了です。

Install-Package ClosedXML

Close XMLを使ってエクセルを読み込むコード

コードは以下の通りです。

/// <summary>
/// 取込みボタンクリック時
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void import_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();                     //エクセルシートのデータを格納
    DataRow dr = null;                                  //エクセルのデータを(1行分)格納
    string filePath = "";                               //エクセルのパスを格納
    int lastRow = 0;                                    //最終行番号を格納
    int lastColumn = 0;                                 //最終列番号を格納

    XLWorkbook objWorkBook = null;                        //workbookオブジェクト
    IXLWorksheet objSheet = null;                         //シートオブジェクト
    IXLRange objRrange = null;                            //rangeオブジェクト

    
    //ダイアログでファイルパスを取得
    filePath = getExcelPath();

    //エクセルをインスタンス化
    objWorkBook = new XLWorkbook(filePath);

    //シートを取得
    objSheet = objWorkBook.Worksheet(1);

    //最終行、列を取得
    lastRow = objSheet.LastRowUsed().RowNumber();
    lastColumn = objSheet.LastColumnUsed().ColumnNumber();

    //シートのデータをrangeに取込む
    objRrange = objSheet.Range(objSheet.Cell(1, 1), objSheet.Cell(lastRow, lastColumn));


    //datatableに列を作成(列数分ループ)
    for (int col = 1; col <= lastColumn; col++)
    {
        dt.Columns.Add(objSheet.Cell(1, col).Value.ToString());
    }


    //シートをdatatableに取込む
    //行数分ループ(ヘッダの次の行から開始)
    for (int row = 2; row <= lastRow-1; row++)
    {
        //行を作成
        dr = dt.NewRow();

        //Datarowに列ごとのデータをセット
        for (int col = 1; col <= lastColumn; col++)
        {
            dr[col-1] = objSheet.Cell(row, col).Value;
        }

        //datatableにDatarowを挿入
        dt.Rows.Add(dr);

    }            

    //データグリッドビューにセット
    dataGridView1.DataSource = dt;

    MessageBox.Show("完了");
    
}
/// <summary>
/// ファイルパスを返す
/// </summary>
/// <returns></returns>
public string getExcelPath()
{
    string path = "";

    //ファイルダイアログを生成する
    OpenFileDialog op = new OpenFileDialog();
    op.Title = "ファイルを開く";
    op.Filter = "すべてのファイル(*.*)|*.*";
    op.FilterIndex = 1;

    //オープンファイルダイアログを表示する
    DialogResult dialog = op.ShowDialog();

    //「開く」ボタンが選択された時の処理
    if (dialog == DialogResult.OK)
    {
        path = op.FileName;
    }
    //「キャンセル」時の処理
    else if (dialog == DialogResult.Cancel)
    { }

    return path;
}

2007以降、エクセルはXMLで作られている

実はエクセルは2007年以降XMLで作られています。

Excel 2007では、データの保存形式がXMLに変更されたため….

新しい標準ファイル形式「XML」(第2回) より

なので、Close XMLで処理できるのは拡張子が新しいものだけです。

対象の拡張子はxlsx、xlsm、xltmです。

毎回エクセルを立ち上げることもないので早く処理できます。

ABOUT ME
LooseCarrot
LooseCarrot
ブログ運営をしているLooseCarrotです。 興味のあることにトライして発信していきます! プロフィール

関連している記事