EPPlus日期单元格数据类型不工作

本文关键字:工作 数据类型 单元格 日期 EPPlus | 更新日期: 2023-09-27 18:04:36

我有一些接受IEnumerable并从中生成Excel文档的代码。IEnumerable中的对象有一个日期字段,我希望这些字段在Excel中被格式化为日期。然而,当你在Excel中查看它时,日期似乎不是"日期"数据类型,直到你双击单元格,然后按enter键。当您这样做时,值移动到右对齐,并且表过滤器正常工作。如果不执行双击并输入操作,则值将被左对齐,表过滤器将其视为文本而不是日期。我需要Excel将其视为开箱即用的日期。

这是我的代码。

/// <summary>
/// Converts any IEnumerable to an Excel Document. Objects appear in the order declared in the class.
/// </summary>
/// <typeparam name="T">Any object.</typeparam>
/// <param name="objects">List of objects to generate document from.</param>
/// <returns>Byte array representing a .xlsx file.</returns>
public static byte[] ToExcelDocument<T>(this IEnumerable<T> objects)
{
    int currentrow = 1;
    Type type = typeof(T);
    List<PropertyInfo> propertyinfos = type.GetProperties().ToList();
    int numcolumns = propertyinfos.Count;
    ExcelPackage pck = new ExcelPackage();
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add(type.Name + "(s)");
    for (int i = 0; i < numcolumns; i++)
    {
        ws.Cells[currentrow, i + 1].Value = propertyinfos[i].Name;
    }
    currentrow++;
    foreach (object o in objects)
    {
        for (int i = 0; i < propertyinfos.Count; i++)
        {
            if (o.GetType().GetProperty(propertyinfos[i].Name).PropertyType == typeof(DateTime))
            {
                ws.Cells[currentrow, i + 1].Style.Numberformat.Format = "m/d/yyyy";
                DateTime dt = (DateTime)(o.GetType().GetProperty(propertyinfos[i].Name).GetValue(o, null));
            }
            else if (o.GetType().GetProperty(propertyinfos[i].Name).PropertyType == typeof(DateTime?))
            {
                DateTime? dt = (DateTime?)(o.GetType().GetProperty(propertyinfos[i].Name).GetValue(o, null));
                if (dt.HasValue)
                {
                    ws.Cells[currentrow, i + 1].Style.Numberformat.Format = "m/d/yyyy";
                    ws.Cells[currentrow, i + 1].Value = dt.Value.ToString("MM/dd/yyyy");
                }
            }
            else
            {
                ws.Cells[currentrow, i + 1].Value = o.GetType().GetProperty(propertyinfos[i].Name).GetValue(o, null);
            }
        }
        currentrow++;
    }
    ExcelAddressBase eab = new ExcelAddressBase(1, 1, currentrow - 1, numcolumns);
    ws.Tables.Add(eab, "MyTable");
    ws.Tables["MyTable"].TableStyle = OfficeOpenXml.Table.TableStyles.Medium15;
    ws.Cells.AutoFitColumns();
    MemoryStream ms = new MemoryStream();
    pck.SaveAs(ms);
    return ms.ToArray();
}

我认为ws.Cells[currentrow, i + 1].Style.Numberformat.Format = "m/d/yyyy";将足以完成我想要的,但它似乎没有工作。当您在Excel中右键单击单元格并转到格式单元格时,它显示已选择日期,但它似乎不适用于表过滤器。从"从老到新"变成"从a到z"

EPPlus日期单元格数据类型不工作

不要使用ToString(),

ws.Cells[currentrow, i + 1].Value = dt.Value; // dont do this -> .ToString("MM/dd/yyyy");

它无法确定数据格式是什么。我对十进制数字也有类似的问题,我试图"预格式化"它们。

也在你的第一个"如果",在那里你检查值是一个日期,不应该返回值被放入excel表格,而不是进入一个新的变量称为dt?