エクセルをC#で処理するときにMicrosoft.Office.Interop.Excelを参照追加して処理することが今のところは主流です。
C# エクセルをDatatble,Datagridviewに取込み(複数シート)
C#でエクセルをdatatableに取込むことはたまにあると思います。
備忘録として残しておきます。
実際に作ったフ...
ここで面倒なことがあります。
プロセスが残らないよう制御が面倒です。
いちいちエクセルを開くので時間がかかる。
Excel(Office)がインストールされていない端末では使えない
ということで、エクセルを開かず、読込む方法を紹介します。
デモンストレーションで動かした動画を載せておきます。
officeがインストールされていない端末でデモをしています。
Closed XMLの参照設定追加
ClosedXMLで参照追加が必要です。
手順は以下の通りです。
パッケージマネージャコンソールを開く
「ツール」→「NuGetパッケージマネージャ」→「パッケージマネージャコンソール」の順で開きます。
インストール実行
その後、Install-Packageコマンドを実行して完了です。
1 |
Install-Package ClosedXML |
Close XMLを使ってエクセルを読み込むコード
コードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
/// <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に変更されたため….
なので、Close XMLで処理できるのは拡張子が新しいものだけです。
対象の拡張子はxlsx、xlsm、xltmです。
毎回エクセルを立ち上げることもないので早く処理できます。