如何在使用EPPlus时设置列类型

Mic*_*ael 63 epplus

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

一切正常,除了我想要将列的类型之一设置为Date.我试图把我的列类型DataTable,以Date比传递DataTable到表现层,但它似乎EPPlus要么,忽略了它,或者不承认,因为当我打开生成的Excel文件,细胞的类型Number.

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

ban*_*ing 83

您确实需要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!
Run Code Online (Sandbox Code Playgroud)


ins*_*zio 40

根据此讨论(epplus.codeplex.com/discussions/349927),您还可以将列格式设置为日期.

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

  • 仅供参考,这来自System.Globalization,因此您必须使用System.Globalization添加该命名空间. (5认同)

mid*_*der 8

如果您的列可能会四处走动(我们知道最终用户往往很善变),或者您的电子表格中散布着许多日期列,那么编写一些通用的内容将很有帮助。这是我刚刚写的。它在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";
        }
Run Code Online (Sandbox Code Playgroud)

如果要执行多个数据表,则可能需要将其重构为一个函数。

这是一个免费赠品...我不能相信此代码。它获取一个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;
    }
Run Code Online (Sandbox Code Playgroud)