c#通过sharepoint客户端更新sharepoint中excel文件中的链接

c#通过sharepoint客户端更新sharepoint中excel文件中的链接,c#,sharepoint,sharepoint-2010,C#,Sharepoint,Sharepoint 2010,我有一个主excel文件,它链接到sharepoint文件夹中的其他几个子excel文件。让我们将主excel称为main.xlsx,子excel称为sub1.xlsx,sub2.xlsx 每个excel的第一行相同(标题行)。main.xlsx的第二行引用了sub1.xlsx。main.xlsx的第三行引用sub2.xlsx,依此类推 main.xlsx中第二行第一个单元格包含的值等于sub1.xlsx中第二行第一个单元格的内容。main.xlsx中第二行第二个单元格包含的值等于sub1.xl

我有一个主excel文件,它链接到sharepoint文件夹中的其他几个子excel文件。让我们将主excel称为main.xlsx,子excel称为sub1.xlsx,sub2.xlsx

每个excel的第一行相同(标题行)。main.xlsx的第二行引用了sub1.xlsx。main.xlsx的第三行引用sub2.xlsx,依此类推

main.xlsx中第二行第一个单元格包含的值等于sub1.xlsx中第二行第一个单元格的内容。main.xlsx中第二行第二个单元格包含的值等于sub1.xlsx中第二行第二个单元格的内容,依此类推。 类似地,main.xlsx中第三行的单元格链接到sub2.xlsx的第二行

请参考图片了解EXCEL之间的链接。

这些文件都位于sharepoint文件夹中。我的目标是将main.xlsx文件下载到本地服务器。excels sub1、sub2将由各自的用户修改。因此,在下载时,主excel应该有更新的内容。这就是我面临的问题

我想在下载之前更新主excel中的链接

下面是我的代码

var clientContext = new ClientContext(url)
ClientContext context = new ClientContext("https://siteurl");
context.Credentials = new NetworkCredential("userid", "password", "domain");
context.Load(context.Web);
List list = context.Web.Lists.GetByTitle("document library");
context.Load(list);
context.ExecuteQuery();
CamlQuery query = new CamlQuery();
query.ViewXml = "<view/>";
ListItemCollection licoll = list.GetItems(query);
context.Load(licoll);
context.ExecuteQuery();
string filePath = @"D:\Docs\sp\";
foreach(ListItem li in licoll)
{
    Microsoft.SharePoint.Client.File file = li.File;
    if(file!=null && file.Name == "main.xlsx")
    {
        var fileRef = file.ServerRelativeUrl;
        FileInformation fileInfo = file.OpenBinaryDirect(context, fileRef.ToString());

        var fileName = Path.Combine(filePath,(string)file.Name);
        using (var fileStream = System.IO.File.Create(fileName))
        {                  
            fileInfo.Stream.CopyTo(fileStream);
        }    
    }
}
var clientContext=新的clientContext(url)
ClientContext=新的ClientContext(“https://siteurl");
context.Credentials=新的网络凭据(“用户ID”、“密码”、“域”);
Load(context.Web);
List List=context.Web.Lists.GetByTitle(“文档库”);
加载(列表);
context.ExecuteQuery();
CamlQuery query=新建CamlQuery();
query.ViewXml=“”;
ListItemCollection licoll=list.GetItems(查询);
加载(licoll);
context.ExecuteQuery();
字符串文件路径=@“D:\Docs\sp\”;
foreach(licoll中的列表项li)
{
Microsoft.SharePoint.Client.File File=li.File;
if(file!=null&&file.Name==“main.xlsx”)
{
var fileRef=file.ServerRelativeUrl;
FileInformation fileInfo=file.OpenBinaryDirect(context,fileRef.ToString());
var fileName=Path.Combine(filePath,(string)file.Name);
使用(var fileStream=System.IO.File.Create(fileName))
{                  
fileInfo.Stream.CopyTo(fileStream);
}    
}
}
代码运行良好。唯一的问题是,如果有人更新了sub1或sub2 excel,则主excel中的值不会更新

下载后,我无法更新主excel中的链接,因为原始文件位于sharepoint中。 那么,在下载到本地计算机之前,如何更新主excel中的链接呢


通过excelservices或REST API可以实现吗?

首先,该查询将增加大量额外开销,您无需提取所有列表项

其次,在使用Excel的API获取本地filestream后编辑文件。因为在你下载之前你没有这个文件。如果您在服务器端执行此操作,则可以“在下载之前”执行此操作。但他们真的不需要,像上面所示(fileinfo.Stream),在代码中的内存中下载它。然后继续在内存中创建一个新的Excel工作簿(您需要一份的副本来执行此操作)

Microsoft.Office.Interop.Excel.Application xls = new Microsoft.Office.Interop.Excel.Application()
Workbook wb = xls.Application.Workbooks.Open(fileInfo.Stream);

/* edit document here */

wb.SaveAs(fileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault); //saves your changes to the local drive location you specified
wb.Close();

Workbooks.Open方法不接受filestream对象。它只接受作为字符串的文件路径。它还接受MemoryStream。因此更改为:MemoryStream ms=new MemoryStream();fileInfo.Stream.CopyTo(ms);然后在memorystream.Workbooks.Open上执行.Open操作。Open不接受除文件路径以外的任何内容作为字符串。您能告诉我如何提供内存流作为输入吗?哎呀,只有OpenXML方法支持memorystream,然后您可以使用它来更新所需的单元格:)