如何在Excel电子表格中填充基于单元格的用户数据

hyrbngr7  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(144)

我在Excel文档中有一封关于内部用户的邮件。我们在单元格中有用户的UPN。我想调用图形API来填充其他数据。这里是一个配置了Excel文件的示例表。
| | A级|B| C语言|D级|E级|F级|G级|高|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|
| 一个|统一PN|业务领域|位置|州/省|地区名称|市场|职务名称|所属部门|
我不想只加载odata as explained in this article,因为我们有超过100,000个用户。
我是否应该考虑使用C# graph API SDK,或者是否有一种方法可以使用“获取数据”功能只加载我需要的用户和详细信息?

qybjjes1

qybjjes11#

由于不建议或不支持从Power Query(Excel中的获取数据功能)连接到Microsoft Graph REST API,因此您需要使用替代解决方案。
我可以分享一个简单的例子,如何将数据写入存储在本地文件系统上的Excel文件。
要阅读本地文件系统上的Excel文件,可以使用NPOI NuGet。要从C#调用Graph API,我建议使用Microsoft.Graph NuGet。

// class for working with xlsx file
XSSFWorkbook xssfwb;
var fileName = @"<path_to_xlsx_file>";
using (var file = File.OpenRead(fileName))
{
    // load content of the file
    xssfwb = new XSSFWorkbook(file);
}

// get first sheet
var sheet = xssfwb.GetSheetAt(0);
// iterate rows
// starting on the second row, supposing that the first row contains columns headers
var rowNumber = 1;
while (true)
{
    var row = sheet.GetRow(rowNumber);
    // for empty row GetRow returns null which indicates that all rows were processed
    if (row == null)
    {
        break;
    }
    // get user principal name
    var upn = row.Cells[0].StringCellValue;
    try
    {
        // use upn for call to Graph API, use select method to specify 
        // a limited set of properties you need and to minimize 
        // the size of the response
        var user = async graphClient.Users[upn].Request().Select("property1,property2,...").GetAsync();

        // if there is only one column in the row the rest of columns
        // must be created
        if (row.Cells.Count == 1)
        {
            row.CreateCell(1); // Business area
            row.CreateCell(2); // location
            row.CreateCell(3); // State
            row.CreateCell(4); // Region
            row.CreateCell(5); // Market
            row.CreateCell(6); // Job title
            row.CreateCell(7); // Department
        }
        // set values
        row.Cells[1].SetCellValue(user.property1);
        row.Cells[2].SetCellValue(user.property2);
        row.Cells[3].SetCellValue(user.property3);
        row.Cells[4].SetCellValue(user.property4);
        row.Cells[5].SetCellValue(user.property5);
        row.Cells[6].SetCellValue(user.property6);
        row.Cells[7].SetCellValue(user.property7);
    }
    catch (Exception ex)
    {
        // handle exceptions either from Graph API or from NPOI
        // throttling, non-existing users, etc.
    }
    // iterate row
    rowNumber++;
}
// save result
using (var file = File.Create(fileName))
{
    xssfwb.Write(file);
}

问题是您的Excel文件中有100,000条记录,我不确定整个解决方案的性能,很可能无法满足您的期望。
参考文献:
NPOI
Lack of Support for Microsoft Graph in Power Query
Microsoft Graph .NET Client Library

相关问题