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

如何用C#获取电子表格的实际数据范围?

解决Google Sheets实际数据范围识别与空行终止问题

核心问题修正

  1. 固定范围导致空行处理:你当前使用固定范围A3:AW28,会包含无数据的空行,需动态获取工作表的实际数据边界。
  2. 空行判断逻辑错误:row[n].ToString().Trim() == null永远不会触发,因为Trim()返回的是字符串类型,空内容会得到""而非null。
  3. 冗余Slack客户端创建:循环内重复创建RestClient会浪费资源,建议移到循环外复用。

修正后的代码

public static void ReadEntries() 
{
    // 1. 获取工作表的实际维度信息
    var sheetRequest = _service.Spreadsheets.Get(SpreadsheetId);
    sheetRequest.Ranges = Sheet;
    sheetRequest.Fields = "sheets(data/dimension)";
    var sheetResponse = sheetRequest.Execute();
    
    var dimension = sheetResponse.Sheets[0].Data[0].Dimension;
    int startRow = dimension.StartIndex.Row + 2; // 数据从A3开始,对应索引+2(索引从0开始)
    int endRow = dimension.EndIndex.Row;
    int endCol = dimension.EndIndex.Column;

    // 2. 动态构建数据范围
    var range = $"{Sheet}!A{startRow}:{GetColumnLetter(endCol)}{endRow}";
    SpreadsheetsResource.ValuesResource.GetRequest valuesRequest =
      _service.Spreadsheets.Values.Get(SpreadsheetId, range);

    var valuesResponse = valuesRequest.Execute();
    IList<IList<object>> values = valuesResponse.Values;

    if (values != null && values.Count > 0) 
    {
        // 3. 提前初始化Slack客户端和请求模板
        var slackClient = new RestClient("<slack webhook>");
        slackClient.Timeout = -1;
        var slackRequestTemplate = new RestRequest(Method.POST);
        slackRequestTemplate.AddHeader("Content-Type", "application/json");

        foreach (var row in values) 
        {
            // 4. 判断空行:首列无内容则终止循环
            if (row.Count == 0 || string.IsNullOrWhiteSpace(row[0]?.ToString().Trim()))
            {
                break;
            }

            // 5. 遍历列检测"null"值
            for (int i = 0; i < endCol; i++) 
            {
                // 处理单元格不存在的情况(空单元格不会出现在row列表中)
                if (i >= row.Count || row[i] == null)
                {
                    continue;
                }

                var cellValue = row[i].ToString().Trim();
                if (cellValue == "null") 
                {
                    // 构建Slack消息体
                    var body = $"{{\"text\": \"发现null值:行{startRow + values.IndexOf(row)}, 列{GetColumnLetter(i+1)}\"}}";
                    slackRequestTemplate.AddParameter("application/json", body, ParameterType.RequestBody);
                    slackClient.Execute(slackRequestTemplate);
                    Console.WriteLine($"已发送Slack消息:行{startRow + values.IndexOf(row)}, 列{GetColumnLetter(i+1)}");
                }
            }
        }
    } 
    else 
    {
        Console.WriteLine("No data found.");
    }
}

// 辅助方法:将列索引转换为字母(如1→A,26→Z,27→AA)
private static string GetColumnLetter(int columnIndex)
{
    string letter = "";
    while (columnIndex > 0)
    {
        int remainder = (columnIndex - 1) % 26;
        letter = Convert.ToChar(65 + remainder) + letter;
        columnIndex = (columnIndex - 1) / 26;
    }
    return letter;
}

关键说明

  • 动态获取维度:通过Spreadsheets.Get请求获取工作表的实际数据边界,避免固定范围的局限性。
  • 空行判断:检查行是否为空,或首列是否为空字符串,确保遇到数据末尾时终止循环。
  • Slack客户端复用:将客户端和请求模板移到循环外,减少资源消耗。
  • 空单元格处理:Google Sheets API返回的Values中,空单元格不会被包含,所以需要判断索引是否越界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:20:42