Прежде всего, я понимаю, что есть аналогичный вопрос здесь , заданный несколько лет назад, однако ответ там только говорит, как сохранить обратно идентичный файл в качестве источника, но с другим именем .
Что я задумал: я использую клиентскую объектную модель Sharepoint ( CSOM ) для изменения содержимого файла Excel, хранящегося в Sharepoint Online. Поскольку значения некоторых ячеек необходимо обновить, я обратился к EPPlus , чтобы помочь с частью доступа к данным.
Аутентификация в Sharepoint Online и чтение данных из Excel файл работает нормально. Проблема в том, что вы пытаетесь сохранить изменения. Код ниже:
OfficeDevPnP.Core.AuthenticationManager authManager = new OfficeDevPnP.Core.AuthenticationManager();
var context = authManager.GetWebLoginClientContext("https://tenant.sharepoint.com");
var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, "/Shared Documents/myFile.xlsx");
using (var memoryStream = new MemoryStream())
{
fileInfo.Stream.CopyTo(memoryStream);
using (var p = new ExcelPackage(memoryStream))
{
var ws = p.Workbook.Worksheets["Sheet1"];
ws.Cells[1, 1].Value = "newValue";
p.Save();
Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, "/Shared Documents/myFile.xlsx", memoryStream, true);
}
}
MemoryStream
необходимо использовать, поскольку EPPlus плохо работает с FileInfo.Stream
, и попытка создать новый ExcelPackage
на основе такого потока приводит к System.NotSupportedException: 'This stream does not support seek operations.'
.
Вернемся к проблеме: при запуске приведенного выше кода метод SaveBinaryDirect
выдает The remote server returned an error: (409) Conflict
, несмотря на явный четвертый параметр, указывающий ему перезаписать существующий файл.
Попытка сохранение в альтернативный файл (например, myFile2.aspx) будет успешным, однако получившийся документ всегда поврежден.
Я пытаюсь понять, что я здесь делаю не так. В качестве альтернативы, если другой подход, включающий CSOM, будет работать лучше, любые подсказки будут весьма признательны.