上传单行Excel时出现There is no row at position 0错误求助
问题分析与解决方案
问题描述
上传仅包含一行数据的Excel文件时,运行给定C#代码出现错误提示:There is no row at position 0,错误发生在获取工作表名称的代码行:
string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString().Replace('\'', ' ').Trim();
错误原因
connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)返回的dtExcelSchema数据表无任何行,说明OleDb连接未识别到Excel文件中的有效工作表。常见诱因:
- 连接字符串设置
HDR=YES时,Excel唯一一行被识别为表头,OleDb判定工作表无数据行,因此无法识别为有效表 - Excel工作表名称含特殊字符,导致OleDb无法正常读取
- 文件未正确保存,或工作表处于隐藏状态
修复步骤
1. 增加空值校验,避免索引越界
在获取工作表名称前,先判断dtExcelSchema是否有数据行,防止直接访问索引0报错:
System.Data.DataTable dtExcelSchema = connExcel.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); if (dtExcelSchema == null || dtExcelSchema.Rows.Count == 0) { ScriptManager.RegisterStartupScript(this, GetType(), "NoSheetAlert", "alert('Excel文件中未找到有效工作表');", true); connExcel.Close(); return; } string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString().Replace('\'', ' ').Trim();
2. 调整连接字符串HDR参数
如果Excel只有一行数据(无单独表头行),将连接字符串中的HDR=YES改为HDR=NO,让OleDb把该行识别为数据行而非表头:
// 修改格式化语句中的参数,将"YES"替换为"NO" conStr = String.Format(conStr, fname, "NO");
若Excel第一行确实是表头,需确保文件至少包含两行(表头+数据)。
3. 检查工作表状态与名称
- 确保Excel工作表未被隐藏
- 避免工作表名称包含特殊字符(如空格、括号等),若必须使用,代码中已通过方括号包裹处理,可忽略此点
4. 修正MIME类型设置错误
原代码中.xls对应的MIME类型设置错误,需改为application/vnd.ms-excel,否则可能导致文件识别异常:
switch (extension) { case ".xlsx": type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; break; case ".xls": type = "application/vnd.ms-excel"; // 修正此处 break; }
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

