Excel date format using EPPlus

后端 未结 9 529
长情又很酷
长情又很酷 2020-12-18 17:44

I\'m having trouble with format my cells to Date.

FileInfo info = new FileInfo(path);
using (ExcelPackage package = new ExcelPackage(info))
{
      ExcelWork         


        
相关标签:
9条回答
  • 2020-12-18 18:01

    I agree with Yosoyke. You're probably targeting the wrong cells. You can try:

    ws.Cells["A3"].Style.Numberformat.Format = "yyyy-mm-dd";
    ws.Cells["A3"].Formula = "=DATE(2014,10,5)";
    
    0 讨论(0)
  • 2020-12-18 18:04

    I wanted to add that the setting of the format was the solution for me. But, I could not get it to work until I set the value property to a DateTime object and not a string. That was the key to making it all work.

    0 讨论(0)
  • 2020-12-18 18:09

    You can try, If you want using AM/PM

       worksheet.Cells[1].Style.Numberformat.Format = "dd/MM/yyyy  HH:mm:ss AM/PM";
    
    0 讨论(0)
  • 2020-12-18 18:13

    Generic solution which takes IEnumerable (data) it loops through the properties of the generic object finds which is of DateType or nullableDate Type and applies formatting:

       //set the list of dateColumns which will be used to formate them
                List<int> dateColumns = new List<int>();
    
                //get the first indexer
                int datecolumn = 1;
    
                //loop through the object and get the list of datecolumns
                foreach (var PropertyInfo in data.FirstOrDefault().GetType().GetProperties())
                {
                    //check if property is of DateTime type or nullable DateTime type
                    if (PropertyInfo.PropertyType == typeof(DateTime) || PropertyInfo.PropertyType == typeof(DateTime?))
                    {
                        dateColumns.Add(datecolumn);
                    }
                    datecolumn++;
                }
    
                // Create the file using the FileInfo object
                var file = new FileInfo(outputDir + fileName);
    
                //create new excel package and save it
                using (var package = new ExcelPackage())
                {
                    //create new worksheet
                    var worksheet = package.Workbook.Worksheets.Add("Results");
    
    
                    // add headers
                    worksheet.Cells["A1"].LoadFromCollection(data, true);
    
                    //format date field 
                    dateColumns.ForEach(item => worksheet.Column(item).Style.Numberformat.Format = "dd-mm-yyyy");
    
                    // auto size columns
                    worksheet.Cells.AutoFitColumns();
    
                    //save package
                    package.SaveAs(file);
                }
    
    0 讨论(0)
  • 2020-12-18 18:18
    worksheet.Cells["YOURDATECELL_OR_YOURDATECELLRANGE"].Style.Numberformat.Format = "mm-dd-yy";
    

    if you use the formula mentioned by taraz. do add worksheet.Calculate() in the end. reference https://epplus.codeplex.com/wikipage?title=About%20Formula%20calculation

    Or instead of using formula, Alternative approach

    private static decimal GetExcelDecimalValueForDate(DateTime date)
    {
        DateTime start = new DateTime(1900, 1, 1);
        TimeSpan diff = date - start;
        return diff.Days + 2;
    }
    

    Reference

    worksheet.Cells["A2"].Value = GetExcelDecimalValueForDate(Convert.ToDateTime('2016-04-29'));
    worksheet.Cells["A2"].Style.Numberformat.Format = "mm-dd-yy";//or m/d/yy h:mm
    

    By Default when excel saves a date field it saves it as numFormatId 14(Look at the xml files in the xls). This ensure the date formats correctly in any country when the file is opened. In Epplus mm-dd-yy translates to numFormatId 14 for excel. This will ensure that when the file is opened in any country the date will be formatted correctly based on the country's short date settings. Also noticed m/d/yy h:mm formats correctly for any country.

    0 讨论(0)
  • 2020-12-18 18:21

    I was having the same problem with my CSV to be transformed. I was able to do this in a little different manner.

    private string ConvertToExcel(string CSVpath, string EXCELPath)
        {
            try
            {
                string Filename = System.IO.Path.GetFileNameWithoutExtension(CSVpath);
                string DirectoryName = System.IO.Path.GetDirectoryName(CSVpath);
                EXCELPath = DirectoryName + "\\" + Filename + ".xlsx";
    
                string worksheetsName = "Report";
                bool firstRowIsHeader = false;
    
                var format = new OfficeOpenXml.ExcelTextFormat();
                format.Delimiter = '|';
                format.EOL = "\n";
    
                using (OfficeOpenXml.ExcelPackage package = new OfficeOpenXml.ExcelPackage(new System.IO.FileInfo(EXCELPath)))
                {
                    string dateformat = "m/d/yy h:mm";
                    //string dateformat = System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
    
                    OfficeOpenXml.ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetsName);
                    worksheet.Cells["A1"].LoadFromText(new System.IO.FileInfo(CSVpath), format, OfficeOpenXml.Table.TableStyles.Medium2, firstRowIsHeader);
    
                    worksheet.Column(3).Style.Numberformat.Format = dateformat;
                    worksheet.Column(5).Style.Numberformat.Format = dateformat;
                    worksheet.Column(6).Style.Numberformat.Format = dateformat;
                    worksheet.Column(20).Style.Numberformat.Format = dateformat;
                    worksheet.Column(21).Style.Numberformat.Format = dateformat;
                    worksheet.Column(22).Style.Numberformat.Format = dateformat;
    
    
    
    
                    package.Save();
                }
            }
            catch (Exception ex)
            {
                //DAL.Operations.Logger.LogError(ex);
                Console.WriteLine(ex);
                Console.Read();
            }
            return EXCELPath;
        }
    
    0 讨论(0)
提交回复
热议问题