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"
不要使用ToString(),
ws.Cells[currentrow, i + 1].Value = dt.Value; // dont do this -> .ToString("MM/dd/yyyy");
它无法确定数据格式是什么。我对十进制数字也有类似的问题,我试图"预格式化"它们。
也在你的第一个"如果",在那里你检查值是一个日期,不应该返回值被放入excel表格,而不是进入一个新的变量称为dt?