CsvHelper写入默认DateTime时输出空字符串替代默认值问题
CsvHelper写入DateTime默认值输出空字符串实现方案
问题原因
当前配置存在两个核心问题,导致默认DateTime值输出异常:
- 非可空
DateTime类型的默认值(数据库存储的0001-01-01即DateTime.MinValue)不会走DateTime?类型的转换规则,给DateTime?配置空格式的代码对这类值不生效 Formats参数仅用于指定日期的输出格式,不支持配置“特定值输出为空”的规则,无法自动识别数据库默认值做空值处理
解决步骤
- 自定义DateTime类型转换器,识别默认值时返回空字符串,非默认值按指定格式输出:
public class DefaultValueDateTimeConverter : DateTimeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) { if (value is DateTime dt && dt == DateTime.MinValue) { return string.Empty; } return base.ConvertToString(value, row, memberMapData); } }
如果业务中数据库默认DateTime值不是
0001-01-01(比如部分旧系统用1900-01-01作为默认值),只需要修改判断条件里的对比值即可。
- 修改CsvWriter初始化配置,注册自定义转换器,移除无效的空格式配置:
using (var memoryStream = new MemoryStream()) { using (var streamWriter = new StreamWriter(memoryStream)) { using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture)) { if (!string.IsNullOrEmpty(header)) { csvWriter.WriteField(header); csvWriter.NextRecord(); } // 注册自定义转换器 csvWriter.Configuration.TypeConverterCache.AddConverter<DateTime>(new DefaultValueDateTimeConverter()); // 统一配置正常日期的输出格式 csvWriter.Configuration.TypeConverterOptionsCache.GetOptions<DateTime>().Formats = new[] { "dd/MM/yyyy" }; csvWriter.Configuration.TypeConverterOptionsCache.GetOptions<DateTime?>().Formats = new[] { "dd/MM/yyyy" }; csvWriter.Configuration.RegisterClassMap<TMap>(); csvWriter.WriteRecords(records); WriteGrandTotals(columnTotals, csvWriter); } } return memoryStream.ToArray(); }
可选配置
如果不需要全局对所有DateTime字段做默认值转空的处理,可以不用全局注册转换器,在TMap类映射中,单独给需要处理的字段指定转换器即可:
public class YourEntityMap : ClassMap<YourEntity> { public YourEntityMap() { // 其他字段映射配置 Map(m => m.YourDateTimeField).TypeConverter<DefaultValueDateTimeConverter>(); } }
内容的提问来源于stack exchange,提问作者Hafiz Muhammad Atif
相关产品推荐
相关产品推荐

