ClosedXML 匯出Excel功能(筆記)

XSLXHelper

先於NuGet下載套件ClosedXML

建立IXSLHelper interface

public interface IXSLXHelper
{
    /// <summary>
    /// 匯出Excel
    /// </summary>
    /// <typeparam name="T">Model</typeparam>
    /// <param name="data">匯出資料</param>
    /// <returns>XLWorkbook</returns>
    XLWorkbook Export<T>(IEnumerable<T> data);
}

建立實作

/// <summary>
/// XSLXHelper
/// </summary>
public class XSLXHelper : IXSLXHelper
{
	/// <summary>
	/// 產生excel
	/// </summary>
	/// <typeparam name="T">傳入的物件型別</typeparam>
	/// <param name="data">物件資料集</param>
	/// <returns>XLWorkbook</returns>
	public XLWorkbook Export<T>(IEnumerable<T> data)
	{
		////建立 excel 物件
		XLWorkbook workbook = new XLWorkbook();
		////加入 excel 工作表名為 "Report"
		var sheet = workbook.Worksheets.Add("Report");
		////欄位起始位置
		int colIdx = 1;
		////使用 reflection 將物件屬性取出當作工作表欄位名稱(列表名稱)
		foreach (var item in typeof(T).GetProperties())
		{
			#region - 可以使用 DescriptionAttribute 設定,找不到 DescriptionAttribute 時改用屬性名稱 -
			////可以使用 DescriptionAttribute 設定,找不到 DescriptionAttribute 時改用屬性名稱
			DescriptionAttribute description = item.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
			if (description != null)
			{
				sheet.Cell(1, colIdx++).Value = description.Description;
				continue;
			}
			sheet.Cell(1, colIdx++).Value = item.Name;
			#endregion

			#region - 直接使用物件屬性名稱
			////直接使用物件屬性名稱
			//sheet.Cell(1, colIdx++).Value = item.Name;
			#endregion

		}

		////資料起始列位置(列表資料)
		int rowIdx = 2;
		foreach (var item in data)
		{
			////每筆資料欄位起始位置
			int conlumnIndex = 1;
			foreach (var content in item.GetType().GetProperties())
			{
				////將資料內容加上 "'" 避免受到 excel 預設格式影響,並依 row 及 column 填入
				sheet.Cell(rowIdx, conlumnIndex).Value = string.Concat("'", Convert.ToString(content.GetValue(item, null)));
				conlumnIndex++;
			}
			rowIdx++;
		}

		return workbook;
	}
}

使用實作:

//使用AutoFac
var app = scope.Resolve<IDataReportService>();
var results = app.GetModelList();
var excel = scope.Resolve<IXSLXHelper>();
var report = excel.Export<ModelList>(results);
var filePath = $"{title}.xlsx";
report.SaveAs(filePath);