如何用C#获取电子表格的实际数据范围?
解决Google Sheets实际数据范围识别与空行终止问题
核心问题修正
- 固定范围导致空行处理:你当前使用固定范围
A3:AW28,会包含无数据的空行,需动态获取工作表的实际数据边界。 - 空行判断逻辑错误:
row[n].ToString().Trim() == null永远不会触发,因为Trim()返回的是字符串类型,空内容会得到""而非null。 - 冗余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
相关产品推荐
相关产品推荐

