How to export DataTable to Excel

后端 未结 21 2659
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 15:36

How can I export a DataTable to Excel in C#? I am using Windows Forms. The DataTable is associated with a DataGridView control. I have

21条回答
  •  佛祖请我去吃肉
    2020-11-22 15:43

    This solution is basically pushing List data to Excel, It uses DataTable to achieve this, I implemented an extension method, so basically there are two things needed. 1. An Extension Method.

    public static class ReportHelper
    {
        public static string ToExcel(this IList data)
        {
            PropertyDescriptorCollection properties =
                TypeDescriptor.GetProperties(typeof(T));
            DataTable table = new DataTable();
            foreach (PropertyDescriptor prop in properties)
            {
                //table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
                if (prop.Attributes[typeof(FGMS.Entity.Extensions.ReportHeaderAttribute)] != null)
                {
                    table.Columns.Add(GetColumnHeader(prop), Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
                }
            }
    
            //So it seems like when there is only one row of data the headers do not appear
            //so adding a dummy blank row which fixed the issues
            //Add a blank Row - Issue # 1471
            DataRow blankRow = table.NewRow();
            table.Rows.Add(blankRow);
    
            foreach (T item in data)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    //row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    if (prop.Attributes[typeof(FGMS.Entity.Extensions.ReportHeaderAttribute)] != null)
                    {
                        row[GetColumnHeader(prop)] = prop.GetValue(item) ?? DBNull.Value;
                    }
                table.Rows.Add(row);
            }
            table.TableName = "Results";
            var filePath = System.IO.Path.GetTempPath() + "\\" + System.Guid.NewGuid().ToString() + ".xls";
            table.WriteXml(filePath);
    
            return filePath;
        }
    
        private static string GetColumnHeader(PropertyDescriptor prop)
        {
            return ((FGMS.Entity.Extensions.ReportHeaderAttribute)(prop.Attributes[typeof(FGMS.Entity.Extensions.ReportHeaderAttribute)])).ReportHeaderText;
        }       
    }
    
    1. Decorate your DTO classes with the Attribute [ReportHeaderAttribute("Column Name")]
    public class UserDTO
        {
            public int Id { get; set; }
            public int SourceId { get; set; }
            public string SourceName { get; set; }
    
            [ReportHeaderAttribute("User Type")]
            public string UsereType { get; set; }
    
            [ReportHeaderAttribute("Address")]
            public string Address{ get; set; }
    
            [ReportHeaderAttribute("Age")]
            public int Age{ get; set; }
    
            public bool IsActive { get; set; }
    
            [ReportHeaderAttribute("Active")]
            public string IsActiveString
            {
                get
                {
                    return IsActive ? "Yes" : "No";
                }
            }}
    

    Everything that needs to be a column in the Excel has to be decorated with [ReportHeaderAttribute("Column Name")]

    Then Simply

    Var userList = Service.GetUsers() //Returns List of UserDTO;
    var excelFilePath = userList.ToExcel();
    
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                var stream = new FileStream(excelFilePath, FileMode.Open);
                result.Content = new StreamContent(stream);
                result.Content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/vnd.ms-excel");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "UserList.xls" };
    
                return result;
    

    提交回复
    热议问题