C#のメモ帳　エクセルファイル形式の出力

C#からエクセルファイルへ出力するのは超面倒。
備忘の為、残します。

DataTableからではなく、dataGridViewからの出力例です。
列毎に出力しています。
列毎に書式設定することが多いので、理にかなっていると思いました。

お手本↓
http://whoopsidaisies.hatenablog.com/entry/2013/12/03/141352
http://nkurilog.blogspot.com/2018/01/vbnetc-excel.html



```C#:
        private void buttonエクセル出力_Click(object sender, EventArgs e)
        {
            dynamic xlApp = null;
            dynamic xlBooks = null;
            dynamic xlBook = null;
            dynamic xlSheet = null;
            dynamic xlCells = null;
            dynamic xlRange = null;
            dynamic xlCellStart = null;
            dynamic xlCellEnd = null;
            try
            {
                xlApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
                xlBooks = xlApp.Workbooks;
                xlBook = xlBooks.Add;
                xlSheet = xlBook.WorkSheets(1);
                xlCells = xlSheet.Cells;

                object[,] columnData = new object[dataGridView1.RowCount + 1, 1];  //ヘッダー分を+1

                int row = 0;        //dataGridView1.RowCountの値
                int col = 0;        //dataGridView1.ColumnCountの値
                //↑エクセルに当てはめる際は+1!!!


                //列毎にエクセルに値を渡す…
                for (col = 0; col < dataGridView1.ColumnCount; ++col)
                {
                    //ヘッダーの代入
                    columnData[0, 0] = dataGridView1.Columns[col].HeaderCell.Value;

                    //値の代入
                    for (row = 0; row < dataGridView1.RowCount; ++row)
                    {
                        columnData[1 + row, 0] = dataGridView1.Rows[row].Cells[col].Value.ToString();
                    }

                    //エクセルの代入セル範囲指定
                    xlCellStart = xlCells[1, col + 1];
                    xlCellEnd = xlCells[dataGridView1.RowCount + 1, col + 1];   //Rowの+1はヘッダー分
                    xlRange = xlSheet.Range(xlCellStart , xlCellEnd);

                    switch (col)
                    {
                        case 1: //文字列
                            xlRange.NumberFormatLocal = "@"; 
                            break;
                    }

                    xlRange.value2 = columnData;

                }

                xlCells.EntireColumn.AutoFit();
                //xlRange = xlSheet.UsedRange;
                //xlRange.Borders.LineStyle = 1;  // xlContinuous

                //ヘッダーのみボーダー＆グレー
                xlCellStart = xlCells[1, 1];
                xlCellEnd = xlCells[1, dataGridView1.ColumnCount]; 
                xlRange = xlSheet.Range(xlCellStart, xlCellEnd);
                xlRange.Borders.LineStyle = 1;          // xlContinuous
                xlRange.Interior.ColorIndex = 15;       //グレー

                xlApp.Visible = true;
            }
            catch
            {
                xlApp.DisplayAlerts = false;
                xlApp.Quit();
                throw;
            }
            finally
            {
                if (xlCellStart != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCellStart);
                if (xlCellEnd != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCellEnd);
                if (xlRange != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
                if (xlCells != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells);
                if (xlSheet != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
                if (xlBook != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
                if (xlBooks != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
                if (xlApp != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

                GC.Collect();
            }

        }
```