最近幫朋友做網站,有提到能不能弄一個把資料匯出成 Excel 檔的功能,剛好最近看到網路上有人分享 ClosedXML,於是寫了支小程式來測試。

專案中,用 NuGet 搜尋 ClosedXML 就能找到了。

2014-06-29_232348

 

首先定義資料的格式。

    public class TestClass
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }

        public string Field1;
        public string Field2;
    }

 

由於 ClosedXML 接受的參數是 DataTable,所以先寫一個將物件轉換為 DataTable 的功能,用基本的 Reflection 就能處理。

        public static DataTable ConvertObjectsToDataTable(IEnumerable<object> objects)
        {
            DataTable dt = null;

            if (objects != null && objects.Count() > 0)
            {
                Type type = objects.First().GetType();
                dt = new DataTable(type.Name);

                foreach (PropertyInfo property in type.GetProperties())
                {
                    dt.Columns.Add(new DataColumn(property.Name));
                }

                foreach (FieldInfo field in type.GetFields())
                {
                    dt.Columns.Add(new DataColumn(field.Name));
                }

                foreach (object obj in objects)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn column in dt.Columns)
                    {
                        PropertyInfo propertyInfo = type.GetProperty(column.ColumnName);
                        if (propertyInfo != null)
                        {
                            dr[column.ColumnName] = propertyInfo.GetValue(obj, null);
                        }

                        FieldInfo fieldInfo = type.GetField(column.ColumnName);
                        if (fieldInfo != null)
                        {
                            dr[column.ColumnName] = fieldInfo.GetValue(obj);
                        }
                    }
                    dt.Rows.Add(dr);
                }
            }

            return dt;
        }

 

接下來將 DataTable 轉換為 Excel 檔,使用上出乎意料的簡單。

        public static void ExportExcelFromDataTable(DataTable dt, string fileName)
        {
            XLWorkbook workbook = new XLWorkbook();
            workbook.AddWorksheet(dt, "Sheet1");
            workbook.SaveAs(fileName);
            workbook.Dispose();
        }

測試程式。

            List<TestClass> list = new List<TestClass>();
            list.Add(new TestClass { Prop1 = "p1", Prop2 = "p2", Field1 = "f1", Field2 = "f2" });
            DataTable dt = ExcelUtility.ConvertObjectsToDataTable(list);
            ExcelUtility.ExportExcelFromDataTable(dt, "test.xlsx");

 

程式碼放在 GitHub,有興趣可以參考看看。

範例程式

 

另外,程式碼裡還包含了 ASP.NET MVC 的東西。

        public ActionResult Download()
        {
            List<TestClass> list = new List<TestClass>();
            list.Add(new TestClass { Prop1 = "p1", Prop2 = "p2", Field1 = "f1", Field2 = "f2" });
            DataTable dt = ExcelUtility.ConvertObjectsToDataTable(list);
            System.IO.MemoryStream stream = ExcelUtility.ExportExcelStreamFromDataTable(dt);
            FileContentResult fResult = new FileContentResult(stream.ToArray(), "application/x-xlsx");
            fResult.FileDownloadName = "test.xlsx";
            return fResult;
        }

 

參考資料

Dynamic Objects Conveting into Data Table in C#

ASP.NET MVC 匯出 Excel 簡單做 - 使用 ClosedXML

Content Type 大全

arrow
arrow
    全站熱搜

    卑微研究生 發表在 痞客邦 留言(0) 人氣()