[C＃]EPPlusを使って、データテーブルをエクセル出力してみた。

#目次
[1. 背景と目的](#1-背景と目的)
[2. 私の実行環境](#2-私の実行環境)
[3. EPPlus紹介](#3-epplus紹介)
[4. sampleアプリケーション概要](#4-sampleアプリケーション概要)
[5. sampleアプリ作成とEPPlus導入](#5-sampleアプリ作成とepplus導入)
[6. コードと説明](#6-コードと説明)
[7. 参考](#7-参考)

#1. 背景と目的
元々はCOM(Microsoft.Office.Interop.Excel)を使用していたのですが、速度が遅く感じたのでEpplusでエクセル操作をやってみました。
データテーブルをDTO（Data Transfer Object）として使っていましたが、DTOでエクセルテーブルを綺麗に作ってくれる機能がとても便利なので記事にしたくなりました。記録しといて忘れたらまた見るためにも！

#2. 私の実行環境
- .NET Framework 4.7.2
- Visual Studio Professional 2019

#3. EPPlus紹介
- .NETアプリケーションでxlsxファイルを読み書きできるライブラリです。
- メリットはxlsxファイルの編集のみであれば、Excel自体はいらないです。
- デメリットは旧形式ファイル(.xls) を読み込むことができません。

#4. sampleアプリケーション概要
フォームのボタンを押したら、事前に設定したデータテーブルをエクセルファイルに書き込みして、そのファイルを開ける簡単なアプリです。

#5. sampleアプリ作成とEPPlus導入
1. ファイル→新規作成プロジェクトを選択して、Windowsフォームアプリケーション（.NET Framework）選びます。
* ソリューション エクスプローラーの中、プロジェクトからマウス右クリックでNuGetパッケージの管理の画面に入ります。
* 参照で EPPlus を検索しインストールします。
* プロジェクト参照の中にEPPlusと色々生成されます。
* Form1.csでF7を押してフォームコードを表示します。
* ``using OfficeOpenXml;``をコードの頭に書きます。

これでEPPlusインストールは完了です。

次はボタンを作成します。
ボタンのプロパティからクリックイベントも設定します。
エクセル出力処理コードはイベントの中に書いていきます。
###フォームボタンのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699635/45e118f8-3f67-2305-1d1e-a202355664a5.png)
#6. コードと説明
```C#
using OfficeOpenXml;
using OfficeOpenXml.Table;
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;

namespace simpleEPPLUS //プロジェクトの名前
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //ボタンのクリックイベント
        private void Excel_output(object sender, EventArgs e)
        {
            //ExcelPackageで使う新しいファイルを生成
            FileInfo newFile = new FileInfo("sample.xlsx");

            //もし同じ名前のファイルが存在したら、削除して新しいファイルを生成
            if (newFile.Exists)
            {
                newFile.Delete();
                newFile = new FileInfo("sample.xlsx");
            }

            //ライセンス関連
            // If you use EPPlus in a noncommercial context
            // according to the Polyform Noncommercial license:
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            //新しいXLSXファイルを生成
            //ExcelPackageクラスのコメントにJan Källmanさんのサンプルコードがあります！
            using (ExcelPackage package = new ExcelPackage(newFile))
            {
                //空のワークブックに新しいワークシートを追加
                var sheet = package.Workbook.Worksheets.Add("sheet1");

                //データテーブルを生成
                DataTable dt = new DataTable();

                //カラムを生成
                dt.Columns.Add("ID", Type.GetType("System.Int32"));
                dt.Columns.Add("軽自動車", Type.GetType("System.String"));
                dt.Columns.Add("メーカー", Type.GetType("System.String"));
                dt.Columns.Add("評判", Type.GetType("System.Double"));                

                //行を追加
                dt.Rows.Add(1, "ワゴンR", "スズキ", 3.9);
                dt.Rows.Add(2, "N-BOX", "ホンダ", 4.2);
                dt.Rows.Add(3, "タント", "ダイハツ", 4.0);

                // B1セルにタイトルを書き込み
                sheet.Cells["B1"].Value = "軽自動車一覧";

                //データテーブルからエクセルファイルに書き込み処理
                sheet.Cells[3, 1].LoadFromDataTable(dt, true, TableStyles.Medium7);

                //カラムの幅を自動調整
                sheet.Cells.AutoFitColumns(1);

                //作ったファイルを保存
                package.Save();
            }

            //sample.xlsxファイルを関連付けられたソフト（エクセル）で開く
            System.Diagnostics.Process.Start("sample.xlsx");
        }
    }
}
```
##ボタンクリック実行結果　エクセルイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699635/a5d6a870-50ae-9533-e604-25afbd199d69.png)
軽自動車一覧タイトルとテーブルが指定したセルから生成されたのが確認できます。

### LoadFromDataTableメソッドについて
```C#
sheet.Cells[3, 1].LoadFromDataTable(dt, true, TableStyles.Medium7);
```
1. LoadFromDataTableメソッドの引数は1番目に表示するデータテーブルを入れます。
* ２番目はヘッダーを表示させるかどうかを決めるbool型をいれます。trueの場合、上のエクセルイメージのようにヘッダーと一緒にフィルターも表示されます。
* ３番目にはテーブルスタイル指定ができます。上ではMedium7で緑と白色のスタイルが適用された状態です。このスタイルはシート上でテーブルがある場合、テーブル上のセルを選択したらデザイン項目が現れます。その中のテーブルスタイル項目から確認できます。いろいろ試して好きに変更できます。

EPPlus制作者 Jan Källmanさんに感謝です❣



#7. 参考
EPPlusの使い方 https://chawatoyo.blog.fc2.com/blog-entry-5.html
　chawatoyoさんのホームページをいつも参考にしております。

EPPlus 5 https://github.com/EPPlusSoftware/EPPlus
Qiita記事作成方法 https://qiita.com/U-MA/items/996ae933ae94c5711883
外部アプリケーションを起動　https://dobon.net/vb/dotnet/process/shell.html