如何强制LinqToExcel将列读取为字符串类型
如何强制LinqToExcel将列读取为字符串类型
我太懂你遇到的这个坑了!LinqToExcel处理CSV里的短横线(-)时,经常会默认把它识别成空值或者非字符串类型,导致你用Cast<string>()的时候直接返回null。下面给你几个实用的解决办法,你可以按需试试:
方法一:给列添加类型映射,强制按字符串读取
你可以在创建ExcelQueryFactory后,为容易出问题的列(比如你的Code和Name列)添加明确的类型映射,告诉LinqToExcel不管单元格里是什么内容,都要转换成字符串:
var excelFile = new LinqToExcel.ExcelQueryFactory(file); // 为Code和Name列添加映射,强制转字符串 excelFile.AddMapping<IncomingPayments>( entity => entity.Code, "Code", cellValue => cellValue.ToString() ); excelFile.AddMapping<IncomingPayments>( entity => entity.Name, "Name", cellValue => cellValue.ToString() ); // 后续的查询逻辑保持不变 var result = (from row in excelFile.Worksheet(0) let item = new IncomingPayments { Code = row["Code"].Cast<string>(), Name = row["Name"].Cast<string>(), CustomerCode = row["CustomerCode"].Cast<string>(), Amount = row["Amount"].Cast<double>(), Type = row["Type"].Cast<string>(), } select item).ToList();
这样配置后,不管单元格里是短横线还是其他内容,都会被强制转换成字符串,不会被当成null处理。
方法二:直接用ToString()替换Cast<string>()
Cast<string>()在遇到LinqToExcel解析成DBNull的值(比如短横线)时会返回null,换成ToString()就能安全处理这种情况,还可以用空合并运算符兜底:
var result = (from row in excelFile.Worksheet(0) let item = new IncomingPayments { // 安全调用ToString(),如果是null就返回短横线 Code = row["Code"]?.ToString() ?? "-", Name = row["Name"]?.ToString() ?? "-", CustomerCode = row["CustomerCode"].Cast<string>(), Amount = row["Amount"].Cast<double>(), Type = row["Type"].Cast<string>(), } select item).ToList();
这个方法改动最小,不需要额外配置映射,直接修改字段的赋值逻辑就行,很适合快速解决问题。
方法三:配置CSV解析规则,不把短横线当空值
LinqToExcel默认可能会把短横线当成空值标记,你可以通过修改CsvConfiguration来调整这个行为:
var excelFile = new LinqToExcel.ExcelQueryFactory(file); // 指定用CSV引擎解析 excelFile.DatabaseEngine = LinqToExcel.Domain.DatabaseEngine.Csv; // 自定义CSV配置,关闭自动把短横线转null的逻辑 excelFile.CsvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture) { TreatEmptyValuesAsNulls = true, ConvertNulls = false // 关闭自动转换null的功能 };
这样配置后,LinqToExcel就不会把短横线识别成null了,读取时会直接保留原始的短横线字符串。
个人推荐先试试方法二,改动小见效快;如果还是有问题,再考虑用方法一或方法三调整配置。
备注:内容来源于stack exchange,提问作者Kinyanjui Kamau
相关产品推荐
相关产品推荐

