72

EPPlus用来生成Excel文件,在 DAL 中我正在DataTable填充、将数据填充到表中,并将表传递给表示层。从那里我使用LoadFromDataTable()方法来生成Excel文件。

一切正常,除了我想将列的类型之一设置为Date. 我尝试将我的列类型设置为DataTable传递DateDataTable表示层,但它似乎EPPlus要么忽略它,要么无法识别,因为当我打开生成Excel的文件时,单元格的类型是Number.

如果我手动设置单元格格式并将类型设置为Date,则Excel显示正确的日期。那么我该如何实现呢?

4

5 回答 5

92

您确实需要 DataTable 列具有正确的类型,但您还需要修改列或单元格的 Style.Numberformat.Format 属性。

假设你有一个ExcelWorksheet名字ws

ws.Column(1).Style.Numberformat.Format  = "yyyy-mm-dd"; 
//OR "yyyy-mm-dd h:mm" if you want to include the time!
于 2012-04-17T17:51:04.203 回答
42

基于此讨论 ( epplus.codeplex.com/discussions/349927 ),您还可以将列格式设置为最新。

worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;

于 2015-03-04T13:04:43.437 回答
11

如果您的列可能会四处移动(我们知道最终用户往往变化无常),或者您的电子表格中散布着许多日期列,那么编写一些更通用的东西会很有帮助。这是我刚刚写的。它在我的 POCO 中找到所有 DateTime 类型的位置,并创建一个列表,然后用于设置列格式。请记住,数据表是从零开始的,而 Excel 不是。

        ws.Cells.LoadFromDataTable(tbl, true);
        var dPos = new List<int>();
        for (var i = 0; i < tbl.Columns.Count; i++)
            if (tbl.Columns[i].DataType.Name.Equals("DateTime"))
                dPos.Add(i);
        foreach (var pos in dPos)
        {
            ws.Column(pos+1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM";
        }

如果您正在处理多个数据表,您可能希望将其重构为一个函数。

这是一个免费赠品......我不能因为这段代码而受到赞扬。它需要一个 POCO 列表并将其转换为数据表。在我的“工具包”中多次使用它使我的生活更轻松。享受。

        public DataTable ConvertToDataTable<T>(IList<T> data)
    {
        var properties =
           TypeDescriptor.GetProperties(typeof(T));
        var table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            var row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }
于 2017-05-14T07:08:45.693 回答
4

这是一个很好的 C# 扩展方法,可以帮助从带有标题和正确日期格式的集合中加载:

(使用列标题的描述属性装饰您的属性)

public static class EpPlusExtensions
{
    public static void Load<T>(this ExcelWorksheet worksheet, IEnumerable<T> collection)
    {
        worksheet.Cells["A1"].LoadFromCollection(collection, true);

        var properties = typeof(T).GetProperties();

        for (var i = 0; i < properties.Length; i++)
        {
            if (new []{typeof(DateTime), typeof(DateTime?)}.Contains(properties[i].PropertyType)) 
            {
                worksheet.Column(i + 1).Style.Numberformat.Format = "m/d/yyyy";
            }
        }
    } 
}
于 2018-11-16T20:24:00.203 回答
3

要使用 excel 格式的构建,您需要将正确的字符串传递给

sheet.Cells[1, 1].Style.Numberformat.Format 

财产。

现在,在执行期间的某个地方,可能在序列化期间,EPPlus 将尝试将此格式属性与工作簿中的当前样式字典匹配。它可能取决于确切的库版本,但例如 EPPlust 4.1.0.0 的短日期键是“mm-dd-yy”。

对于 4.1.0.0,您可以在以下格式中找到所有硬编码代码和密钥:

  1. ExcelNumberFormatXml.cs,internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats)- 这里所有这些代码实际上都包含在工作簿中,都是硬编码的
  2. 使用调试器并检查Workbook.Styles.NumberFormats枚举(作为关键使用ExcelNumberFormatXml.Format
  3. 使用调试器并检查Workbook.Styles.NumberFormats.(非公共成员)_dic的确切密钥。
于 2017-05-30T11:09:33.660 回答