我正在使用EPPlus
生成Excel
文件,在DAL中我填充DataTable
,将数据填充到表中,并将表传递给表示层。从那里我使用LoadFromDataTable()
方法生成Excel
文件。
一切正常,除了我想将列的类型之一设置为Date
。我试图设置我的DataTable
toDate
的列类型,然后将DataTable
传递给Presentation Layer,但它似乎也是EPPlus
,忽略它,或者不认识,因为当我打开生成的Excel
文件时,单元格的类型是Number
。
如果我手动设置单元格格式并将类型设置为Date
,则Excel
显示正确的日期。那我该怎么做呢?
您确实需要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!
根据此讨论(epplus.codeplex.com/discussions/349927),您还可以将列格式设置为日期。
worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
如果您的列可能会移动(因为我们知道最终用户往往变幻无常)或者您的电子表格中只有很多日期列,那么编写一些更通用的内容会很有帮助。这就是我刚写的内容。它在我的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;
}
要使用excel格式的构建,您需要将正确的字符串传递给
sheet.Cells[1, 1].Style.Numberformat.Format
属性。
现在,稍后在执行期间,可能在序列化期间,EPPlus将尝试将此格式属性与工作簿中的当前样式字典进行匹配。它可能取决于精确的库版本,但例如对于EPPlust 4.1.0.0,短日期键是“mm-dd-yy”。
对于4.1.0.0,您可以找到所有硬编码的代码和密钥,以便在以下格式中构建:
internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats)
- 这里所有这些代码实际上都包含在工作簿中,都是硬编码的Workbook.Styles.NumberFormats
枚举(作为关键使用ExcelNumberFormatXml.Format
)这是一个很好的C#扩展方法,可以帮助从带有标题的集合和正确的日期格式加载:
(使用列标题的Description属性装饰属性)
Workbook.Styles.NumberFormats.