read and write excel file in csharp using epplus Edit
Below is the sample code and Extension method to read write to an excel file using EPPlus. I am using the free version EPPLus 4.0.5.0.
Sample Code
var worksheets = (@"\Files\" "filaname.ext".GetWorkSheetNames(); var excel = filename.Read("Manifest", true); int Skip = 0; foreach (var item in excel) { if (Skip == 0) { Skip = Skip 1; continue; } var expObject = (IDictionary<string, object>)item; Manifest manifest = new Manifest(); new BaseData(manifest, CRUDType.Insert, baseData); manifest.ManifestQuantity = expObject["QTY".toExpandoString()].toFloat(); manifest.Quantity = expObject["QTY".toExpandoString()].toFloat(); } public static string toExpandoString(this String value) { value = value.Replace(" ", ""); value = value.ToLower(); value = value.Trim(); return value; } ----------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using OfficeOpenXml; using System.Drawing; using OfficeOpenXml.Style; using System.IO; using System.Reflection; using System.Web; using System.Dynamic; using Leedhar.Common; namespace Leedhar.Excel { public class Excel { public dynamic Read(String fileName, bool hasHeading = false, String workSheetName = null) { String[] ExcelColumn = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ" }; try { List<dynamic> retval = new List<dynamic>(); List<String> Heading = new List<string>(); byte[] file = File.ReadAllBytes(GetFilePath(fileName)); MemoryStream ms = new MemoryStream(file); using (ExcelPackage ep = new ExcelPackage(ms)) { if (ep.Workbook.Worksheets.Count <= 0) { return null; } else { workSheetName = String.IsNullOrEmpty(workSheetName) ? ep.Workbook.Worksheets.FirstOrDefault().Name : workSheetName; var worksheet = ep.Workbook.Worksheets[workSheetName]; // Heading foreach (var firstRowCell in worksheet.Cells[1, 1, 1, worksheet.Dimension.End.Column]) { if (hasHeading == true) { if (!String.IsNullOrEmpty(firstRowCell.Text)) { Heading.Add(firstRowCell.Text); } } else { if (!String.IsNullOrEmpty(firstRowCell.Address)) { Heading.Add(firstRowCell.Address); } } } // RowStart = 2 if hasHeading = true; int rowStart = hasHeading ? rowStart = 1 : rowStart = 2; // Data for (int i = rowStart; i <= worksheet.Dimension.End.Row; i ) { dynamic dynamicRow = new ExpandoObject(); int column = 1; for(int c=0; c < Heading.Count; c ) { String cell = ExcelColumn[c] (i).ToString(); ExcelRangeBase columnCell = worksheet.Cells[i, 1, i, Heading.Count][cell]; ((IDictionary<string, object>)dynamicRow).Add(Heading[c].ToLower().Replace(" ", ""), columnCell.Text); } //foreach (var columnCell in worksheet.Cells[i, 1, i, Heading.Count]) //{ // ((IDictionary<string, object>)dynamicRow).Add(Heading[column - 1].ToLower().Replace(" ",""), columnCell.Text); // column = column 1; //} retval.Add(dynamicRow); } } } return retval; } catch (Exception ex) { throw ex; } } public List<string> GetWorkSheetNamess(String fileName) { try { List<string> retval = new List<string>(); byte[] file = File.ReadAllBytes(GetFilePath(fileName)); MemoryStream ms = new MemoryStream(file); using (ExcelPackage ep = new ExcelPackage(ms)) { if (ep.Workbook.Worksheets.Count <= 0) return null; else { foreach (var worksheet in ep.Workbook.Worksheets) { retval.Add(worksheet.Name); } } } return retval; } catch (Exception ex) { throw ex; } } public bool WriteToFile(String FileName, Stream stream) { using (var fileStream = File.Create(GetFilePath(FileName))) { var buffer = new byte[512000]; int readCount; while ((readCount = stream.Read(buffer, 0, buffer.Length)) != 0) fileStream.Write(buffer, 0, readCount); } return true; } public string GetFilePath(String fileName) { //is web app if (HttpRuntime.AppDomainAppId != null) { string retval = HttpContext.Current.Server.MapPath(fileName); return retval; } else { String appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); return appPath "\\" fileName; //is windows app } } public bool WriteToCell(ref ExcelWorksheet ws, String Value, String Cell, bool bold = false, Color? color = null) { try { Color bgColor = color == null ? Color.White : color.Value; ws.Cells[Cell].Value = Value; ws.Cells[Cell].Style.Font.Bold = bold; ws.Cells[Cell].AutoFitColumns(); ws.Cells[Cell].Style.Fill.PatternType = ExcelFillStyle.Solid; ws.Cells[Cell].Style.Fill.BackgroundColor.SetColor(bgColor); } catch (Exception ex) { throw; } return true; } public MemoryStream WriteToExcel(String FileName, String FilePath, List<dynamic> dynamic, Dictionary<String, String> HeaderData) { bool header = true; String[] ExcelColumn = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; string sPath = System.Web.Hosting.HostingEnvironment.MapPath("~/" FilePath "/"); string vpath = @"\" FilePath @"\"; if (!System.IO.File.Exists(Path.Combine(sPath FileName))) { return null; } var worksheets = Path.Combine(vpath FileName).GetWorkSheetNames(); byte[] file2 = System.IO.File.ReadAllBytes(Path.Combine(sPath FileName)); MemoryStream ms = new MemoryStream(file2); String workSheetName = ""; MemoryStream epStream; using (ExcelPackage ep = new ExcelPackage(ms)) { if (ep.Workbook.Worksheets.Count <= 0) { return null; } else { workSheetName = String.IsNullOrEmpty(workSheetName) ? ep.Workbook.Worksheets.FirstOrDefault().Name : workSheetName; var worksheet = ep.Workbook.Worksheets[workSheetName]; if (header) { int iHeader = 0; foreach (var headerElement in HeaderData) { String HeaderText = headerElement.Value; (ExcelColumn[iHeader] (1).ToString()).WriteToCell(ref worksheet, HeaderText, false, System.Drawing.Color.LightBlue); iHeader = iHeader 1; } } for (int i = 0; i < dynamic.Count; i ) { String Key = ""; String Value = ""; foreach (System.Collections.Generic.KeyValuePair<String, object> item in dynamic[i]) { Key = item.Key; Value = item.Value != null ? item.Value.ToString() : ""; int Column = HeaderData.DictionaryIndex(Key); if (Column == -1) continue; if (header) { (ExcelColumn[Column] (i 2).ToString()).WriteToCell(ref worksheet, Value, false); } else { (ExcelColumn[Column] (i 1).ToString()).WriteToCell(ref worksheet, Value, false); } } } epStream = new MemoryStream(ep.GetAsByteArray()); } } return epStream; } } } ------------------------------------------ Extensions using OfficeOpenXml; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Leedhar.Excel { public static class Extensions { public static List<String> GetWorkSheetNames(this string fileName) { try { return new Excel().GetWorkSheetNamess(fileName); } catch (Exception ex) { throw ex; } } #region Read Excel Data public static dynamic Read(this string fileName) { try { return new Excel().Read(fileName, false); } catch (Exception ex) { throw; } } public static dynamic Read(this string fileName, bool hasHeading) { try { return new Excel().Read(fileName, hasHeading); } catch (Exception ex) { throw ex; } } public static dynamic Read(this string fileName, string workSheetName) { try { if (String.IsNullOrEmpty(workSheetName)) throw new Exception("Worksheet Name is Empty"); return new Excel().Read(fileName, true, workSheetName); } catch (Exception ex) { throw ex; } } public static dynamic Read(this string fileName, String workSheetName, bool hasHeading) { try { if (String.IsNullOrEmpty(workSheetName)) throw new Exception("Worksheet Name is Empty"); return new Excel().Read(fileName, hasHeading, workSheetName); } catch (Exception ex) { throw ex; } } public static bool WriteToCell(this string Cell, ref ExcelWorksheet ws, string Value, bool bold = false, Color? color = null) { return new Excel().WriteToCell(ref ws, Value, Cell, bold, color); } public static MemoryStream WriteToExcel(this String FileName, String FilePath, List<dynamic> dynamic, Dictionary<String, String> HeaderData) { return new Excel().WriteToExcel(FileName, FilePath, dynamic, HeaderData); } #endregion //public static bool Create(String fileName) //{ // byte[] file = File.ReadAllBytes(GetFilePath(fileName)); // MemoryStream ms = new MemoryStream(file); // using (ExcelPackage ep = new ExcelPackage(ms)) // { // if (ep.Workbook.Worksheets.Count <= 0) // Console.WriteLine("Your Excel file does not contain any work sheets"); // else // { // _Create(ep, "MEA"); // Stream epStream = new MemoryStream(ep.GetAsByteArray()); // WriteToFile(fileName, epStream); // } // } // //ExcelPackage ep = new ExcelPackage(); // //_Create(ep, "LIST", RepairCentre, SHIP_MONTH, failure_only, PROD_GROUP, BUSORG_NAME, RMA_DTL_NO); // return true; //} //private static bool _Create(ExcelPackage p, string sheetName) //{ // p.Workbook.Worksheets.Add(sheetName); // ExcelWorksheet ws = p.Workbook.Worksheets[1]; // ws.Name = sheetName; //Setting Sheet's name // ws.Cells.Style.Font.Size = 11; //Default font size for whole sheet // ws.Cells.Style.Font.Name = "Calibri"; //Default Font name for whole sheet // fillCell(ref ws, "TITLE 1", "A1", true, Color.LightGray); // fillCell(ref ws, "TITLE 2", "B1", true, Color.LightGray); // fillCell(ref ws, "TITLE 3", "C1", true, Color.LightGray); // fillCell(ref ws, "TITLE 4", "D1", true, Color.LightGray); // fillCell(ref ws, "TITLE 5", "E1", true, Color.LightGray); // //ListService _ListService = new ListService(); // //ViewModels.Lists oLists = _ListService.GetAll(); // List<String> oLists = new List<String>(); // int i = 2; // foreach (var bl in oLists) // { // //fillCell(ref ws, "Data", "A" i.ToString(), false); // //fillCell(ref ws, "Data", "B" i.ToString(), false); // i = i 1; // } // return true; //} } } public List<dynamic> ToExpand(List<ILeedhar> ObjectList) { List<dynamic> retval = new List<dynamic>(); foreach (var obj in ObjectList) { System.Reflection.PropertyInfo[] propertyInfo = ObjectList[0].GetType().GetProperties(); dynamic dynamicRow = new ExpandoObject(); for (int i = 0; i < propertyInfo.Length; i ) { String Name = propertyInfo[i].Name; String Value = obj.GetType().GetProperty(propertyInfo[i].Name).GetValue(obj, null) == null ? "" : obj.GetType().GetProperty(propertyInfo[i].Name).GetValue(obj, null).ToString(); ((IDictionary<string, object>)dynamicRow).Add(Name, Value); } retval.Add(dynamicRow); } return retval; } public List<dynamic> ToExpand(List<ILeedhar> ObjectList) { List<dynamic> retval = new List<dynamic>(); foreach (var obj in ObjectList) { System.Reflection.PropertyInfo[] propertyInfo = ObjectList[0].GetType().GetProperties(); dynamic dynamicRow = new ExpandoObject(); for (int i = 0; i < propertyInfo.Length; i ) { String Name = propertyInfo[i].Name; String Value = obj.GetType().GetProperty(propertyInfo[i].Name).GetValue(obj, null) == null ? "" : obj.GetType().GetProperty(propertyInfo[i].Name).GetValue(obj, null).ToString(); ((IDictionary<string, object>)dynamicRow).Add(Name, Value); } retval.Add(dynamicRow); } return retval; } public void AddProperty(ExpandoObject expando, string propertyName, object propertyValue) { // ExpandoObject supports IDictionary so we can extend it like this var expandoDict = expando as IDictionary<string, object>; if (expandoDict.ContainsKey(propertyName)) expandoDict[propertyName] = propertyValue; else expandoDict.Add(propertyName, propertyValue); } public int DictionaryIndex(Dictionary<String, String> dictionary, String Key) { int i = 0; foreach (var dct in dictionary) { if (dct.Key == Key) { return i; } i = i 1; } return -1; }