In this post we will learn to export data into csv file.
Step 1 :- Take a new MVC 4 Project and download the CsvHelper.dll , you can download this dll by the following way
Click on Tools --> Library Package Manager --> Package Manager Console
Now write Install-Package CsvHelper on Package Manager Console
like PM > Install-Package CsvHelper and enter
by this you will get the latest version of CsvHelper.
Step 2:-
Now Make a model class and do some setting for Csv
[DebuggerDisplay("Index = {Index}, Name = {Name}, Ignore = {Ignore}, ReferenceKey = {ReferenceKey}")] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class CsvFieldAttribute : Attribute { public virtual object Default { get; set; } public virtual string Format { get; set; } public virtual bool Ignore { get; set; } public virtual int Index { get; set; } public virtual string Name { get; set; } public virtual string[] Names { get; set; } public virtual string ReferenceKey { get; set; } } public class UserInfo { [CsvField(Index = 0)] public string FirstName { get; set; } [CsvField(Index = 1)] public string LastName { get; set; } [CsvField(Index=2)] public string DOJ { get; set; } }
Step :3- Make a class and write some method which will help in exporting and formatting of Csv
public class Common { public static string GetCsv<T>(List<T> csvDataObjects) { PropertyInfo[] propertyInfos = typeof(T).GetProperties(); var sb = new StringBuilder(); sb.AppendLine(GetCsvHeaderSorted(propertyInfos)); csvDataObjects.ForEach(d => sb.AppendLine(GetCsvDataRowSorted(d, propertyInfos))); return sb.ToString(); } private static string GetCsvDataRowSorted<T>(T csvDataObject, PropertyInfo[] propertyInfos) { IEnumerable<string> valuesSorted = propertyInfos .Select(x => new { Value = x.GetValue(csvDataObject, null), Attribute = (CsvFieldAttribute)Attribute.GetCustomAttribute(x, typeof(CsvFieldAttribute), false) }) .Where(x => x.Attribute != null) .OrderBy(x => x.Attribute.Index) .Select(x => GetPropertyValueAsString(x.Value)); return String.Join(",", valuesSorted); } private static string GetCsvHeaderSorted(PropertyInfo[] propertyInfos) { IEnumerable<string> headersSorted = propertyInfos .Select(x => (CsvFieldAttribute)Attribute.GetCustomAttribute(x, typeof(CsvFieldAttribute), false)) .Where(x => x != null) .OrderBy(x => x.Index) .Select(x => x.Name); return String.Join(",", headersSorted); } private static string GetPropertyValueAsString(object propertyValue) { string propertyValueString; if (propertyValue == null) propertyValueString = ""; else if (propertyValue is DateTime) propertyValueString = ((DateTime)propertyValue).ToString("dd MMM yyyy"); else if (propertyValue is int) propertyValueString = propertyValue.ToString(); else if (propertyValue is float) propertyValueString = ((float)propertyValue).ToString("#.####"); // format as you need it else if (propertyValue is double) propertyValueString = ((double)propertyValue).ToString("#.####"); // format as you need it else // treat as a string propertyValueString = @"""" + propertyValue.ToString().Replace(@"""", @"""""") + @""""; // quotes with 2 quotes return propertyValueString; } }
Step: 4 -
Write a method in Controller which return the FileContentResult and a method for Csv Header
Here, i am taking the static data.
public FileContentResult ExportToCsv() { var userList = new List<UserInfo>(); userList.Add(GetHeader()); int k = -5; for (int i = 0; i < 5; i++) { //static data var userInfo = new UserInfo(); userInfo.FirstName = "abc" + i; userInfo.LastName = "xyz" + i; userInfo.DOJ = DateTime.Now.AddDays(k + i).ToString(); userList.Add(userInfo); } string result =Utility.Common.GetCsv(userList); return File(new System.Text.UTF8Encoding().GetBytes(result), "text/csv", "userinfo.csv"); } public UserInfo GetHeader() { var userInfo = new UserInfo(); userInfo.FirstName = "First Name"; userInfo.LastName = "Last Name"; userInfo.DOJ = "Date of Joining"; return userInfo; }
So, this is the basic example of export data to Csv file in MVC.
You can download the complete solution from the following link