2

我有一个加载到 Office 365 中的 Excel 文件,可以通过 Microsoft Graph API 访问该文件,其中包含许多命名范围,有些是单独的值,有些是单元格块。

我可以使用 API 成功更新单个值,但是当我尝试同时更新多个单元格时,我遇到了问题。

对于此示例,请考虑从F10:F12

我想填充如下:

F10=A

F11=B

F12=C

所以,我创建了最终看起来像这样的字符串列表...... [ ["A"], ["B"], ["C"] ]

我使用以下代码将它传递给 Graph API...

public static async Task<WorkbookRange> UpdateRangeArray(string strItemId, string strSheetName, string strRangeName, List<string> strRangeValues, string strSessionId)
{
    string[][] strValueArray = new string[strRangeValues.Count][];
    try
    {
        int i = 0;
        foreach (var val in strRangeValues)
        {
            strValueArray[i] = new string[1] { val };
            i++;
        }
    }

    var jsonValueArray = JsonConvert.SerializeObject(strValueArray);

    var rangeUpdate = new Microsoft.Graph.WorkbookRange();
    rangeUpdate.Values = jsonValueArray;

    var result = await graphClient.Users[_strUserId].Drive.Items[strItemId].Workbook.Worksheets[strSheetName]
        .Range(strRangeName)
        .Request()
        .Header("workbook-session-id", strSessionId)
        .PatchAsync(rangeUpdate).ConfigureAwait(false);

    return result;

 }

所以我能够更新范围内的值,除了预期值之外,我得到的是这个......

F10=[ ["A"],["B"],["C"] ]

F11=[ ["A"],["B"],["C"] ]

F12=[ ["A"],["B"],["C"] ]

而不是 Graph API 将第一个值放在第一个单元格中,第二个值放在第二个单元格中,等等......它将整个数据数组放在每个单元格中。

我认为这是某种格式错误,也许我的 JSON 格式错误,或者我使用错误的 Graph API 端点或其他东西提交它。

任何帮助将不胜感激...

更新 1:

我还尝试使用 RANGE (即 - .Range("F10:F12"))而不是使用 NAME 来执行此操作,我得到了相同的结果。

更新 2:

在 GitHub 上交叉发布,以防这是一个错误,而不仅仅是用户错误。 https://github.com/microsoftgraph/msgraph-sdk-dotnet/issues/695

更新 3:

我可以通过 Graph API Explorer 成功修补以下 URL... https://graph.microsoft.com/v1.0/me/drive/items/ {item-id}/workbook/worksheets/INPUTS/range(地址='F10:F12')

用这个身体... {"values":[["Hello"],["How"],["Are You?"]]}

......它的工作原理。

但仍然无法通过MSGraph-SDK-dotnet使其工作

更新 4:

我能够使用 Postman 使其正常工作,并且生成的 RestSharp 代码看起来像这样......

    public static async Task TestUpdatePostman()
    {
        var client = new RestClient("https://graph.microsoft.com/v1.0/users/{USER-ID}/drive/items/{ITEM-ID}/workbook/worksheets/INPUTS/range(address='F10:F12')");
        client.Timeout = -1;
        var request = new RestRequest(Method.PATCH);
        request.AddHeader("Authorization", "Bearer {INSERT-TOKEN}");
        request.AddHeader("Content-Type", "application/json");
        request.AddParameter("application/json", "{\"values\":[[\"Hello\"],[\"How\"],[\"Are You?\"]]}", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
        Console.WriteLine(response.Content);
    }

这再次让我相信 SDK 包装器实现 API 调用的方式存在问题。

4

1 回答 1

4

这可能不是 SDK 问题。更新范围时,rangeUpdate.Values 应该是 JToken 类型而不是字符串。尝试使用:

JArray jsonValueArray = JArray.FromObject(strValueArray);
于 2020-08-12T08:45:40.953 回答