2015-05-15 56 views
0

我必須重命名使用的OpenXML Excel工作表,但是當這樣做的引用這些表將不再工作。我一直在試圖改變使用OPENXMLDefinedNameinnerXml但不會設置的值。 這是我到目前爲止有:修改Excel的定義名稱

private void Renamesheet(string sheetName, string newSheetName, string filePath) 
{ 
    using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, true)) 
    { 
     WorkbookPart wbPart = document.WorkbookPart; 

     Sheet sheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault(); 

     sheet.Name = newSheetName; 
     var names = wbPart.Workbook.DefinedNames.Where(x => x.InnerText.ToString().Contains("'" + sheetName + "'")); 
     var i = 0; 
     while (i < names.Count()) 
     { 
      names.ElementAt(i).InnerXml = names.ElementAt(i).InnerXml.Replace(sheetName, newSheetName); 
      i++; 
     } 
     wbPart.Workbook.Save(); 
    } 

} 

我使用while循環,而不是一個foreach因爲我讀了可能會解決這個問題,但事實並非如此。任何幫助都會很棒。

+0

我沒有看到任何地方,你退出'using'語句之前保存更改。我不確定using語句在處置時會自動保存對磁盤的更改。嘗試顯式保存。 –

+0

糟糕,我沒有添加到片段。這是在我的代碼,但。我現在編輯它。 – mattfetz

+0

什麼是表格名稱?您正在用它們周圍的單引號搜索它們。如果名稱中沒有空格,則可能是它們在沒有引號的公式中。我認爲如果你想給出一個跑步的話,你的搜索也可以不用單引號。 –

回答

0
WorkbookPart w= document.WorkbookPart; 
       Sheet sheet = w.Workbook.Descendants<Sheet>().Where(s => s.Name == "abc").FirstOrDefault(); 
       sheet.Name = "dreamers"; (1) 
       w.Workbook.Save(); 

以上三行儘快改變SHEETNAME,如線(1)將被執行 變種名稱= wbPart.Workbook.DefinedNames.Where(X => x.InnerText.ToString()。包含(」 '「+ sheetName +」'「));正如其名稱將改爲

線將拋出一個空引用異常。

在任何情況下將Excel不必須相同DefinedNames爲兩片,以便在那裏將返回一個片材,因此,而無需循環。用戶FirstOrDefault()而不是while。