You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:52:52