使用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属性。
假设你有一个名为ws
的ExcelWorksheet
:
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格式:
- ExcelNumberFormatXml.cs,
internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats)
– 在这里所有这些代码实际上是包含在工作簿,所有硬编码 - 使用debugging器并检查
Workbook.Styles.NumberFormats
枚举(因为键使用ExcelNumberFormatXml.Format
) - 使用debugging器并检查
Workbook.Styles.NumberFormats.
(非公开的_dic
)_dic
为确切钥匙。