エクセルをC#で処理するときにMicrosoft.Office.Interop.Excelを参照追加して処理することが今のところは主流です。
ここで面倒なことがあります。
プロセスが残らないよう制御が面倒です。
いちいちエクセルを開くので時間がかかる。
ということで、エクセルを開かず、読込む方法を紹介します。
実際に作ったファイルはこちらからダウンロードできます。
データテーブルの準備などをしているので、ダウンロード後、そのまま実行できます。
デモンストレーションで動かした動画を載せておきます。
Datatableをエクセルのシートに出力するコード
Datatableの中身をエクセルのシートオブジェクトに出力するメソッドを作りました。
色や罫線も付けています。
取込むデータテーブルは以下です。
流れとしては以下です。
①エクセルのシートに列名を出力
②Datatableの中身をエクセルのシートに出力
この時、「女」セルがあれば、フォントを赤にしています。
③出力した範囲に罫線を引く
④列に色を付ける
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 |
using ClosedXML.Excel; /// <summary> /// データテーブルにデータをエクセルシートにセットする /// </summary> /// <param name="dataTable">データテーブル</param> /// <param name="workSheet">シート</param> /// <returns>データテーブルを出力したシートを返す</returns> public IXLWorksheet outPutDataTableToExcel(DataTable dataTable, IXLWorksheet workSheet) { IXLRange objRrange = null; //rangeオブジェクト //-----------------エクセルにデータテーブルの中身をセット----------------- //列をエクセルにセット for (int col = 1; col <= dataTable.Columns.Count; col++) { workSheet.Cell(1, col).Value = dataTable.Columns[col -1].ColumnName; } //datatableをシートにセットする //行数分ループ(ヘッダの次の行から出力開始) for (int row = 0; row <= dataTable.Rows.Count -1; row++) { //列数分ループ for (int col = 1; col <= dataTable.Columns.Count; col++) { workSheet.Cell(row + 2, col).Value = dataTable.Rows[row][col - 1]; //性別が「女」の場合、フォントを赤にする if(dataTable.Rows[row][col - 1].ToString() == "女") { workSheet.Cell(row + 2, col).Style.Font.FontColor = XLColor.Red; } } } //-----------------エクセルにデータテーブルの中身をセット----------------- //-----------------シートに罫線を引く----------------- //罫線を引く範囲をセット objRrange = workSheet.Range(workSheet.Cell(1, 1), workSheet.Cell(dataTable.Rows.Count +1, dataTable.Columns.Count)); //罫線を引く objRrange.Style.Border.OutsideBorder = XLBorderStyleValues.Thin; objRrange.Style.Border.InsideBorder = XLBorderStyleValues.Thin; //-----------------シートに罫線を引く----------------- //-----------------列に色を付ける----------------- objRrange = workSheet.Range(workSheet.Cell(1, 1), workSheet.Cell(1, dataTable.Columns.Count)); objRrange.Style.Fill.BackgroundColor = XLColor.LightBlue; //-----------------列に色を付ける----------------- return workSheet; } |
解説
列名を出力
16行目~18行目で列を出力しています。
Cell(1,col)で1行目かあから順に出力しています。
Datatableの列の開始は0列目から始まりますが、エクセルは1列目です。
なので、col-1でエクセルとDatatableの列を合せています。
Datatableの中身を出力
23行目~36行目でDatatableの中身を出力しています。
ここもDatatableの行、列のかいしは0からですが、エクセルは1から始まることを考慮しています。
行は列の次の行なので、2行目です。
⇒row+2をして合せています。
また、この時、IF文を使ってDatatableの値が「女」の場合、フォントを赤にしています。
罫線、背景色
それぞれ、列数と行数をDatatableのrows.countとcolumns.countで取得し、
線と色をセットする範囲を指定しています。
_
Closed XMLの参照設定追加
ClosedXMLで参照追加が必要です。
手順は以下の通りです。
パッケージマネージャコンソールを開く
「ツール」→「NuGetパッケージマネージャ」→「パッケージマネージャコンソール」の順で開きます。
インストール実行
その後、Install-Packageコマンドを実行して完了です。
1 |
Install-Package ClosedXML |