C# DataTableを高速にExcel出力する

DataTableを高速にExcel出力できるクラスを作りました。

複雑なように見えますが、ExcelWriterメソッドに「DataTable,書き込みパス,ファイル名」を渡せば、中身の処理が分からなくても、エクセルファイルを簡単に書き込めるので気軽に使ってみてください。

 

スポンサーリンク

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Microsoft.Office.Interop.Excel;

namespace Sample
{
    class Excel
    {
        /// <summary>
        /// Excelブックを新規に作成してデータテーブルの内容を出力します
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="path">書き込み先のディレクトリパス</param>
        /// <param name="name">ファイル名称</param>
        public void ExcelWriter(System.Data.DataTable dt, string path, string name)
        {
            // Excelオブジェクトを生成
            Application ExcelApp = new Application();
            try
            {
                // 上書きの確認ダイアログを非表示
                ExcelApp.DisplayAlerts = false;
                // ウィンドウは非表示
                ExcelApp.Visible = false;
                // ブックを作成
                Workbook wb = ExcelApp.Workbooks.Add();
                // 1枚目のシートを選択
                Worksheet ws = wb.Sheets[1];
                ws.Select(Type.Missing);

                // データテーブルの列ごとでExcelに出力
                for (int col = 0; col < dt.Columns.Count; col++)
                {
                    // +1は項目名の行
                    object[,] obj = new object[dt.Rows.Count + 1, 1];

                    // 項目名出力
                    obj[0, 0] = dt.Columns[col].ColumnName;

                    for (int row = 0; row < dt.Rows.Count; row++)
                    {
                        // データテーブルをobject配列に格納
                        obj[row + 1, 0] = dt.Rows[row][col].ToString();
                    }

                    Range rgn = ws.Range[ws.Cells[1, col + 1], ws.Cells[dt.Rows.Count + 1, col + 1]]; //最初のセル(行,列)~最後のセル(行,列)
                    rgn.Font.Size = 10;
                    rgn.Font.Name = "メイリオ";

                    DataColumn dtcol = dt.Columns[col];
                    if (dtcol.DataType.ToString() == "System.String")
                    {
                        rgn.NumberFormatLocal = "@";  // 表示形式を文字列にする
                        rgn.Value2 = obj;
                    }
                    else //System.Int32
                    {
                        rgn.Value2 = obj;
                    }
                }

                // Bookを保存
                wb.SaveAs(path + name);
                // Bookを閉じる
                wb.Close(false);
                // Excelアプリケーションの終了
                ExcelApp.Quit();
                // COMの解放
                System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
            }
            catch (Exception ex)
            {
                Console.Write(name + "を作成できませんでした。");
                Console.Write(ex.Message);
                // Excelアプリケーションの終了
                ExcelApp.Quit();
            }
        }
    }
}

アセンブリ参照

Microsoft Excel 14.0 Object Libraryを参照設定後、using Microsoft.Office.Interop.Excel;を追加します。

Excelオブジェクトの生成

22行目でExcelオブジェクトを生成後、プロパティを設定しています。

26行目は、同一名称の(既存)ファイルがある場合、上書きしてよいかどうかの確認ダイアログを非表示に設定しています。trueにすればダイアログが出るようになります。

DataTableのカラム名を書き込む

36行目でDataTableのカラム数を最大件数として、1列目・2列目と順々に出力しています。

列ごとで出力している理由は、55行目でDataTypeごとでエクセルに書き込んでいるからです。(ここでは、string型を文字列の表示形式として出力するようにしています)

DataTableを高速にエクセル出力

50行目でRange指定することでDataTableをエクセルに高速出力することができるようになっています。

ブックを保存する

67行目のSaveAsメソッドに書き込むディレクトリパスとファイル名を渡すことで保存されます。

69行目でWorkbookオブジェクトを閉じるためにCloseメソッド実行します。

71行目でエクセルのアプリケーションオブジェクトを終了させるためにCOMを解放してあげます。これを忘れるとプロセスが残り続けてしまうので、必ず行うようにしてください。

タスクマネージャー

スポンサーリンク

SNSでもご購読できます。

コメントを残す