使用 EPPlus 时如何设置列类型

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

一切正常,除了我想将列的一个类型设置为 Date之外。我尝试将我的 DataTable的列类型设置为 Date,然后将 DataTable传递给表示层,但似乎 EPPlus要么忽略它,要么没有识别出来,因为当我打开生成的 Excel文件时,单元格的类型是 Number

如果我手动格式化单元格,并设置类型为 DateExcel显示正确的日期。那么我怎样才能做到这一点呢?

69886 次浏览

您确实需要 DataTable 列具有正确的类型,但是还需要修改列或单元格的 Style。数字格式。格式化属性。

假设你有一个名为 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) ,您还可以设置列格式到目前为止。

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 格式的 build,需要将正确的字符串传递给

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

财产。

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

对于4.1.0.0,你可以找到所有硬编码的代码和密钥来构建格式:

  1. Excelnumberformatxml.cs ,abc 0-这里所有这些代码实际上都包含在工作簿中,都是硬编码的
  2. 使用调试器并检查 Workbook.Styles.NumberFormats枚举(作为键使用 ExcelNumberFormatXml.Format)
  3. 使用调试器并检查 Workbook.Styles.NumberFormats.(非公共成员) _dic的确切键。

这里有一个不错的 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";
}
}
}
}