C#读取含混合字符的DataTable行报错,求解决建议或替代方案
问题:Excel读取DataTable后筛选混合类型字段报错
问题重现
读取Excel文件到DataTable的代码:
string excelAddressListPath = basePath + "/PROPERTIES.xlsx"; if (!File.Exists(excelAddressListPath)) { Console.WriteLine("Missing dependency address file DB, exiting...."); System.Environment.Exit(-1); } DataTable dt; System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); using (var stream = File.Open(excelAddressListPath, FileMode.Open, FileAccess.Read)) { using (var reader = ExcelReaderFactory.CreateReader(stream)) { var conf = new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true } }; var dataSet = reader.AsDataSet(conf); dt = dataSet.Tables[0]; } }
获取数据的函数:
string GetAddressFromDataTable(DataTable dt, string uprn) { string address = ""; Console.WriteLine(uprn); foreach (DataRow row in dt.Select($"[Property Reference] = '{uprn}'")) { address = row["Property Address"].ToString(); } return address; }
调用方式:
string address = GetAddressFromDataTable(dt, uprn.ToUpper()); Console.WriteLine($"From DB: {address}");
当「Property Reference」为纯数字(如12345)时正常,包含字符(如B12345)时抛出错误:
Cannot perform '=' operation on System.Double and System.String.
错误原因
ExcelReaderFactory会根据列中多数数据的类型自动推断列类型。如果「Property Reference」列里既有纯数字(被识别为Double)又有带字符的字符串,组件会把整个列的类型设为Double。此时用字符串类型的uprn去匹配Double类型的列,就会触发类型不匹配的错误。
解决方法
方案1:强制所有列以字符串类型读取(推荐)
修改Excel读取配置,强制指定所有列的类型为字符串,避免自动推断导致的类型混乱:
var conf = new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true, // 配置列类型为字符串 ConfigureColumn = column => { column.DataType = typeof(string); } } };
这样所有数据都会以字符串形式存入DataTable,筛选时类型完全匹配,不会再报错。
方案2:用LINQ替代DataTable.Select筛选
如果不想修改读取逻辑,可以改用LINQ遍历DataTable,手动将字段转为字符串后再比较:
string GetAddressFromDataTable(DataTable dt, string uprn) { var targetRow = dt.AsEnumerable() .FirstOrDefault(row => row["Property Reference"]?.ToString().Equals(uprn, StringComparison.OrdinalIgnoreCase) == true); return targetRow?["Property Address"].ToString() ?? string.Empty; }
这种方式绕开了DataTable.Select的类型检查,直接处理字段的字符串形式,兼容性更好。
方案3:修改Excel文件的列格式
打开Excel文件,将「Property Reference」列的格式设置为文本,保存后再读取。这样组件会直接识别该列为字符串类型,但这种方法依赖文件格式,若文件被他人修改可能再次出现问题,灵活性较差。
内容的提问来源于stack exchange,提问作者james barrett
相关产品推荐
相关产品推荐

