如何用C#将SQL Server存储过程数据导入Google Sheets?
将SQL Server存储过程数据导入Google Sheets的实现方案
问题背景
已实现向Google Sheets插入静态数据的功能,现需将SQL Server存储过程返回的动态列透视表数据导入Google Sheets。现有两段可运行的代码:
- 静态数据插入Google Sheets的代码
- 从SQL Server存储过程获取结果集并生成DataTable的代码
需合并两段代码,实现动态数据的导入。
现有静态插入代码
{ // 指定读取的列范围 var range = $"{sheet}!A:E"; var valueRange = new ValueRange(); // 静态学生数据 var oblist = new List<object>() { "John", "Doe", "john@test.com", "5553332121" }; valueRange.Values = new List<IList<object>> { oblist }; // 追加记录 var appendRequest = service.Spreadsheets.Values.Append(valueRange, SpreadsheetId, range); appendRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.AppendRequest.ValueInputOptionEnum.USERENTERED; var appendReponse = appendRequest.Execute(); }
现有DataTable获取代码
string lConnString = ConfigurationManager.ConnectionStrings["SqlConnectionString"].ToString(); string procedure = "usp_get_menupivot"; DataTable table = new DataTable(); using (SqlConnection conn = new SqlConnection(lConnString)) { conn.Open(); using (SqlCommand command = new SqlCommand(procedure, conn)) { using (var da = new SqlDataAdapter(command)) { command.CommandType = CommandType.StoredProcedure; da.Fill(table); } } } // 原代码生成CSV字符串的部分可弃用
合并后的完整实现代码
// 1. 从SQL Server存储过程获取DataTable string lConnString = ConfigurationManager.ConnectionStrings["SqlConnectionString"].ToString(); string procedure = "usp_get_menupivot"; DataTable table = new DataTable(); using (SqlConnection conn = new SqlConnection(lConnString)) { conn.Open(); using (SqlCommand command = new SqlCommand(procedure, conn)) { using (var da = new SqlDataAdapter(command)) { command.CommandType = CommandType.StoredProcedure; da.Fill(table); } } } // 2. 将DataTable转换为Google Sheets API要求的数据格式 var valueRange = new ValueRange(); var dataRows = new List<IList<object>>(); // 可选:添加表头(如果需要把DataTable的列名作为Sheet表头) var headerRow = table.Columns.Cast<DataColumn>().Select(col => (object)col.ColumnName).ToList(); dataRows.Add(headerRow); // 添加数据行 foreach (DataRow row in table.Rows) { dataRows.Add(row.ItemArray.ToList()); } valueRange.Values = dataRows; // 3. 调用Google Sheets API插入数据 string sheet = "Sheet1"; // 替换为你的工作表名称 var range = $"{sheet}!A:Z"; // 用A:Z适配动态列数,API会自动匹配实际列数 var appendRequest = service.Spreadsheets.Values.Append(valueRange, SpreadsheetId, range); appendRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.AppendRequest.ValueInputOptionEnum.USERENTERED; var appendResponse = appendRequest.Execute();
关键说明
- 动态列适配:使用
A:Z作为范围,无需提前指定固定列数,Google Sheets API会根据传入的数据自动匹配对应列。 - 数据格式转换:直接将DataTable的行数据转换为
List<IList<object>>,替代原代码中生成CSV字符串的逻辑,更高效且符合API要求。 - 表头可选:如果需要将存储过程返回的列名作为Sheet的表头,保留添加表头行的代码;不需要则可删除该部分。
- 批量插入:一次性传递所有数据行,比逐条插入大幅提升效率。
内容的提问来源于stack exchange,提问作者warrenk
相关产品推荐
相关产品推荐

