使用EPPlus时如何设置列类型


68

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

一切工作正常,除了我想将列的类型之一设置为Date。我尝试将“我”的“列”类型设置DataTable为“Date而不是”传递DataTable给“表示层”,但似乎EPPlus忽略了它,或者无法识别,因为当我打开生成的Excel文件时,单元格的类型为Number

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

Answers:


89

您确实需要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!

Excel是否会根据个人Excel设置更改此格式?想想欧盟和美国。

42

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

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


6
仅供参考,这来自System.Globalization,因此您必须“使用System.Globalization”添加该名称空间。
MatthewD

10

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

3

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

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

属性。

现在,在执行过程中的某个地方,可能在序列化期间,EPPlus将尝试将此format属性与工作簿中的当前样式字典进行匹配。它可能取决于确切的库版本,但例如对于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确切的密钥。

3

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

(用列标题的Description属性装饰您的属性)

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";
            }
        }
    } 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.