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

上传单行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:15:13