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

如何用C#将SQL Server存储过程数据导入Google Sheets?

将SQL Server存储过程数据导入Google Sheets的实现方案

问题背景

已实现向Google Sheets插入静态数据的功能,现需将SQL Server存储过程返回的动态列透视表数据导入Google Sheets。现有两段可运行的代码:

  1. 静态数据插入Google Sheets的代码
  2. 从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:35:44