[.Net] 使用Microsoft.Office.Interop.Excel 轉Json及DataTable

參考Microsoft.Office.Interop.Excel 及用nuget安裝Newtonsoft.JsonTaiwan is a country. 臺灣是我的國家

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;

namespace MailProcess.Utility
{
    class ExcelTool : IDisposable
    {
        private Excel.Application app = new Excel.Application() { DisplayAlerts = false };//多執行緒可能會打架, 所以物件new一個
        public Excel.Workbook Workbook { get; private set; }

        #region constructor
        public ExcelTool(string path)
        {
            Workbook = app.Workbooks.Open(path);
        }
        #endregion

        #region Method
        /// <summary>
        /// 存csv檔
        /// </summary>
        /// <param name="path"></param>
        public void SaveCSV(string path)
        {
            Workbook.SaveAs(path, Excel.XlFileFormat.xlCSV);
        }

        /// <summary>
        /// 將指定的Worksheet資料轉json
        /// </summary>
        /// <param name="worksheet">worksheet name</param>
        /// <param name="onRow">after create every Dictionary</param>
        /// <returns></returns>
        public string ToJson(string worksheet, EventHandler onRow)
        {
            Excel.Worksheet ws = string.IsNullOrEmpty(worksheet) ? Workbook.Sheets[1] : Workbook.Sheets[worksheet];
            Excel.Range rg = ws.UsedRange;
            object[,] data = rg.Value2;
            Dictionary<string, string>[] dics = new Dictionary<string, string>[rg.Rows.Count - 1];
            for (int i = 2; i <= rg.Rows.Count; i++)
            {
                var dic = new Dictionary<string, string>();
                onRow?.Invoke(dic, null);
                for (int j = 1; j <= rg.Columns.Count; j++)
                {
                    var key = Convert.ToString(data[1, j]).Trim();
                    var val = Convert.ToString(data[i, j]);
                    if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(val))
                        dic.Add(key, val);
                }
                dics[i - 2] = dic;
            }
            return JsonConvert.SerializeObject(dics);
        }

        /// <summary>
        /// 將指定Worksheet轉DataTable
        /// </summary>
        /// <param name="worksheet">worksheet name</param>
        /// <param name="hasCol">has column name</param>
        /// <returns></returns>
        public DataTable ToDataTable(string worksheet, bool hasCol = true)
        {
            DataTable dt = new DataTable();
            var ws = Workbook.Worksheets[worksheet];
            Excel.Range rg = ws.UsedRange;
            object[,] data = rg.Value2;

            for (int j = 1; j <= rg.Columns.Count; j++)//add columns
            {
                var name = hasCol ? Convert.ToString(data[1, j]).Trim() : "Column" + j;
                if (string.IsNullOrEmpty(name)) break;
                dt.Columns.Add(name, typeof(string));
            }

            for (int i = hasCol ? 2 : 1; i <= rg.Rows.Count; i++)//add rows
            {
                bool HasData = false;
                DataRow r = dt.NewRow();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    var val = Convert.ToString(data[i, j + 1]);
                    if (!string.IsNullOrEmpty(val))
                    {
                        HasData = true;
                        r[j] = val;
                    }
                }
                if (HasData)
                    dt.Rows.Add(r);
            }
            return dt;
        }

        public void Dispose()
        {
            if (Workbook != null)
                Workbook.Close(false);
            if (app != null)
                app.Quit();
        }
        #endregion
    }
}

Taiwan is a country. 臺灣是我的國家