OleDbDataAdapter读取Excel时部分字段为空及行数异常问题
问题解决方法
一、合并单元格字段返回空值的问题
原因分析
OleDb驱动读取Excel时,合并单元格仅会保留合并区域左上角第一个单元格的值,其余合并单元格会被识别为空。此外,驱动默认根据列的前8行数据推断数据类型,如果合并单元格的前几行是空值,驱动可能会将该列判定为“空类型”,导致后续有值的单元格也被读取为空。
解决方案
修改连接字符串,强制文本模式读取
在连接字符串的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即可。手动填充合并单元格的空值
读取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
相关产品推荐
相关产品推荐

