Npoi.Mapper 日期转换
问题:Excel文档里有一些列是日期类型的数据,使用Mapper默认的转换,发现生成的实体,在有的系统环境下能正常转换,但是在有的系统环境下,转换的日期出现中文。
猜想是Excel文档里,日期列的单元格格式是日期,那么转换为字符串时,会生成区域性特定格式的字符串。如果单元格格式是文本,那么应该就没有转换的问题了。
没有找到相关的api可以简捷地设置日期的转换规则,知道的可以留言告诉我
在.Net Core Excel导入导出神器Npoi.Mapper 找到了思路,自定义某一列的转换规则。
我大体上是按照这个思路来解决的,多个日期列就用循环来解决,加入泛型来针对不同的Excel文档,总体来说略显累赘
查看代码
/// <summary>
/// 修复日期转换后存在中文的问题
/// 原因分析:Excel列的类型是DateTime,在不同的系统环境下,经过Mapper的转换,会生成区域性特定格式的字符串
/// 解决方案是对格式为DateTime的列指定自定义的转换规则
/// </summary>
/// <typeparam name="T">Excel文档映射的实体</typeparam>
/// <param name="fileStream">Excel文档的流</param>
/// <param name="dateCols">数据为日期的列名</param>
/// <returns></returns>
public List<T> analysisExcelWithDateCols<T>(Stream fileStream, string[] dateCols) where T : class
{
List<T> ModelList = new List<T>();
var mapper = new Mapper(fileStream);
List<RowInfo<T>> DataList = new List<RowInfo<T>>();
foreach (string dateCol in dateCols)
{
PropertyInfo propertyInfo = typeof(T).GetProperty(dateCol);
mapper.Map<T>(dateCol, dateCol, (excelCol, entity) =>
{
if (excelCol.CurrentValue != null)
{
T obj = entity as T;
if (obj != null)
{
DateTime date;
if (excelCol.CurrentValue is string)
{
date = Convert.ToDateTime(excelCol.CurrentValue);
}
else
{
date = (DateTime)excelCol.CurrentValue;
}
propertyInfo?.SetValue(obj, date.ToString("MM/dd/yyyy"));
}
}
return true;
}, null);
}
DataList = mapper.Take<T>().ToList();
if (DataList != null && DataList.Count > 0)
{
foreach (var item in DataList)
{
ModelList.Add(item.Value);
}
}
return ModelList;
}
posted on 2022-12-12 17:33 drewwestlhq 阅读(186) 评论(0) 编辑 收藏 举报