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



我正在尝试使用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字节。所以我认为问题是与我如何做上传有关-我试图遵循微软文档中的示例- https://learn.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. 使用图形API获取我想要上传的文档路径,将excel工作簿读取到内存流中,然后再次使用图形API将内存流上传到路径作为内容。

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

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);
}

最新更新