簡體   English   中英

C#通過SharePoint客戶端更新SharePoint中Excel文件中的鏈接

[英]c# update links in excel file in sharepoint through sharepoint client

我有一個主要的excel文件,該文件具有指向sharepoint文件夾中其他幾個子excel文件的鏈接。 讓我們將主excel稱為main.xlsx,將sub 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文件下載到本地服務器。 excel的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);
        }    
    }
}

該代碼工作正常。 唯一的問題是,如果有人更新了sub1或sub2 excel,則主excel中的值不會更新。

下載后,由於原始文件位於sharepoint中,因此我無法更新主要Excel中的鏈接。 那么,在將其下載到本地計算機之前,如何更新主要Excel中的鏈接?

是否可以通過excelservices或REST API實現?

首先,該查詢將增加很多額外的開銷,不需要您提取所有列表項。

其次,使用Excel的API獲取本地文件流后,您可以編輯文件。 因為在下載文件之前您沒有文件。 如果您在服務器端進行操作,則可以在“下載前”進行操作。 但是他們的確不需要,如上所示(fileinfo.Stream),將其下載到代碼中的內存中。 然后繼續在內存中創建一個新的Excel工作簿(您將需要Office Developer Tools的副本才能執行此操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM