使用EPPlus时如何设置列types

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

一切工作正常,除了我想将其中一个列的types设置为Date 。 我试图将我的DataTable Columntypes设置为Date ,并将DataTable传递给表示层,但似乎EPPlus要么忽略它,要么无法识别,因为当我打开生成的Excel文件时,单元格的types是Number

如果我手动格式单元格,并将types设置为Date Excel显示正确的date。 那么我怎么能做到这一点呢?

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

假设你有一个名为wsExcelWorksheet

 ws.Column(1).Style.Numberformat.Format = "yyyy-mm-dd"; //OR "yyyy-mm-dd h:mm" if you want to include the time! 

基于这个讨论( epplus.codeplex.com/discussions/349927 )你也可以设置列格式的date。

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

如果您的列可能会移动(因为我们知道最终用户往往是反复无常的),或者您的电子表格中分散了许多date列,那么写一些更通用的东西会很有帮助。 这是我刚刚写的。 它在我的POCO中查找所有DateTimetypes的位置,并创build一个列表,然后用它来设置列格式。 记住数据表是基于零的,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; } 

要使用excel格式构build,您需要将正确的string传递给

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

属性。

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

对于4.1.0.0,您可以在以下位置find所有硬编码代码和密钥以构build格式:

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) – 在这里所有这些代码实际上是包含在工作簿,所有硬编码
  2. 使用debugging器并检查Workbook.Styles.NumberFormats枚举(因为键使用ExcelNumberFormatXml.Format
  3. 使用debugging器并检查Workbook.Styles.NumberFormats. (非公开的_dic_dic为确切钥匙。