c# - 使用 Microsoft Graph API 更新 Excel 命名范围中的值
问题描述
我有一个加载到 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 调用的方式存在问题。
解决方案
这可能不是 SDK 问题。更新范围时,rangeUpdate.Values 应该是 JToken 类型而不是字符串。尝试使用:
JArray jsonValueArray = JArray.FromObject(strValueArray);
推荐阅读
- reactjs - 通过博览会运行的本机应用程序中的守望者警告
- angular - 当我将自定义 PropertyValidator 添加到我的儿子元数据验证器数组时,RadDataForm 失败并出现数组索引插入错误
- python - 为什么这个带有记忆功能的 LCS(最长公共子序列)Python 实现表现不佳?
- c# - 访问 Microsoft.Extensions.HostingServices 时出错。无法解析 JSON 文件
- node.js - nodejs中的JSON并没有给我所有信息
- c++ - Eclipse 中的 C++ - 正在运行的程序部分现在冻结
- java - 仅从 DataFrame 中的列中的时间戳中提取日期 - Java 中的 Spark
- html - 在不修改父布局的情况下将 div 内的内容作为列对齐
- c# - C# 从 Excel 中读取实际单元格值,其中日期格式为长日期,日历类型为西方
- c# - 如何从高度计算弹丸的射程?