使用 Microsoft Graph API 将 Excel 文档上传到 SharePoint 在线时为 0 字节文件

0 Byte file when uploading an Excel document to SharePoint online using the Microsoft Graph API

我正在尝试使用 Microsoft Graph API.

将使用 NPOI 库创建的 Excel 文档上传到 SharePoint Online 网站

当我将 Excel 文件写入本地计算机用户目录时,我可以毫无问题地打开生成的 TestExcelUpload.xslx 文件并看到 'ColOne', 'ColTwo', 'ColThree' 个条目。

但是,当我将 Excel 文件上传到 SharePoint Online 网站时,我可以看到文件已创建,但当我尝试打开它时却收到错误消息 Sorry, we couldn't find 'https://company.sharepoint.com/sites/Technology/Shared Documents/Tool/Data/TestExcelUpload.xlsx'. Is it possible it was moved, renamed or deleted?。如果我下载该文件,我可以看到它的大小为 0 字节。所以我认为问题与我进行上传的方式有关 - 我试图遵循 Microsoft 文档中的示例 - https://docs.microsoft.com/en-us/graph/api/driveitem-put-content?msclkid=5dab86cad12711ec91c842a089f27412&view=graph-rest-1.0&tabs=csharp.

下面的代码是我使用它的地方:

  1. 使用 NPOI 库创建一个简单的 excel 工作簿
  2. 使用文件流将 excel 工作簿写入我的本地目录(我最初只是用它来排除使用 NPOI 创建工作簿的问题)
  3. 使用GraphAPI获取我要上传的文档路径,将excel工作簿读入内存流,然后再次使用GraphAPI上传内存流以路径为内容。

谁能告诉我哪里可能出错了?

public async Task ExcelUploadToSharePointTest()
{
    // 1. Create basic excel .xlsx workbook using NPOI v2.5.6  
    var testColumnData = new List<string> { "ColOne", "ColTwo", "ColThree" };

    var workbook = new XSSFWorkbook();
    var sheet1 = workbook.CreateSheet();
    var row1 = sheet1.CreateRow(0);

    for (var i = 0; testColumnData.Count > i; i++)
    {
        row1.CreateCell(i).SetCellValue(testColumnData[i]);
    }

    // 2. Write workbook to local user directory - works
    await using (var fileSteam = new FileStream($"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}/TestExcelUpload.xlsx", FileMode.Create))
    {
        workbook.Write(fileSteam, true);
    }

    // 3. Write workbook to SharePoint online, by saving to memory stream and uploading using Graph API - not working
    var siteBase = await _graphServiceClient.Sites
        .GetByPath("/sites/Technology", "company.sharepoint.com")
        .Request()
        .GetAsync();

    var rootFolder = _graphServiceClient.Sites[siteBase.Id].Drive.Root;

    await using (var memoryStream = new MemoryStream())
    {
        workbook.Write(memoryStream, true);

        await rootFolder.ItemWithPath("Tool/Data/TestExcelUpload.xlsx").Content.Request().PutAsync<DriveItem>(memoryStream);
    }
}

看来您需要将 memoryStream.Position 设置为 0。

当您调用 workbook.Write(memoryStream, true) 时,流中的当前位置与流的长度相同,因此上传零字节。

await using (var memoryStream = new MemoryStream())
{
    workbook.Write(memoryStream, true);

    memoryStream.Position = 0;

    await rootFolder.ItemWithPath("Tool/Data/TestExcelUpload.xlsx").Content.Request().PutAsync<DriveItem>(memoryStream);
}