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编辑  收藏  举报

导航