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

OleDbDataAdapter读取Excel时部分字段为空及行数异常问题

问题解决方法

一、合并单元格字段返回空值的问题

原因分析

OleDb驱动读取Excel时,合并单元格仅会保留合并区域左上角第一个单元格的值,其余合并单元格会被识别为空。此外,驱动默认根据列的前8行数据推断数据类型,如果合并单元格的前几行是空值,驱动可能会将该列判定为“空类型”,导致后续有值的单元格也被读取为空。

解决方案

  1. 修改连接字符串,强制文本模式读取
    在连接字符串的Extended Properties中添加IMEX=1,强制驱动将所有列按文本类型读取,避免数据类型推断错误:

    var connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0; Data Source={pathToFile}; Extended Properties='Excel 12.0;IMEX=1;HDR=YES'";
    

    说明:HDR=YES表示Excel第一行是表头,若你的文件无表头,改为HDR=NO即可。

  2. 手动填充合并单元格的空值
    读取DataTable后,遍历每一列,将空值单元格填充为同一列上方的有效值(针对纵向合并场景),示例代码如下:

    foreach (DataTable dataTable in ds.Tables)
    {
        // 遍历每一列,填充合并单元格空值
        for (int col = 0; col < dataTable.Columns.Count; col++)
        {
            string prevValidValue = string.Empty;
            for (int row = 0; row < dataTable.Rows.Count; row++)
            {
                var cellValue = dataTable.Rows[row][col].ToString().Trim();
                if (string.IsNullOrEmpty(cellValue))
                {
                    dataTable.Rows[row][col] = prevValidValue;
                }
                else
                {
                    prevValidValue = cellValue;
                }
            }
        }
    
        // 原有转换为二维列表的逻辑保持不变
        for (int e = 0; e < dataTable.Rows.Count; e++)
        {
            var rowItems = new List<string>();
            var dataRow = dataTable.Rows[e];
            for (int i = 0; i < dataRow.ItemArray.Length; i++)
            {
                var entry = dataRow.ItemArray[i];
                rowItems.Add(entry.ToString());
            }
            excelData.Add(rowItems);
        }
    }
    

二、文件打开时行数异常的问题

你采用的提前启动Excel进程的方案是有效的,因为当Excel文件被Excel程序独占打开时,OleDb驱动无法完整读取文件内容,进而导致行数异常。该方案通过避免文件独占锁定解决了问题,可继续使用。


内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:05:18