2016-12-02 53 views
0

我的目標是從workbook.xml中的excel文件中刪除所有"#REF"。我目前能做的是在整個工作簿中查找所有「#REF」參考,但我不知道如何從文件中刪除它們。使用C#在Excel中刪除已定義的名稱或已損壞的引用

我的代碼休耕

這段代碼中找出所有"#REF"文件中

 var spreadsheet = DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(@"C:\Users\Craig\Desktop\newTest.xlsx", false); 
     var workbook = spreadsheet.WorkbookPart; 
     var names = workbook.Workbook.DefinedNames; 





     System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"#REF"); 

     int count= result.InactiveNamedRangeCount = names.Count(n => regex.IsMatch(n.InnerText)); 
     Console.WriteLine(count); 
     foreach (var name in names) 
     { 
      if (regex.IsMatch(name.InnerText)) 
      { 
       Console.WriteLine(name.InnerText); 
      } 
     } 

在這裏,我試圖去儘管每個#REF使用foreach來刪除它,但它不刪除他們中的任何一個,我不知道爲什麼。

foreach (var name in names) 
     { 
      if (regex.IsMatch(name.InnerText)) 
      { 
       name.Remove(); 
       Console.WriteLine(name.InnerText); 
       Console.WriteLine(count); 
      } 
     } 
+1

您是否在刪除'SpreadsheetDocument'後保存了'SpreadsheetDocument'? –

+0

@CharlesMager我使用OpenXml參考你有任何想法如何使用它保存它? –

+1

'Workbook'上的['Save'](https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.workbook.save(v = office.14).aspx)方法是我猜。你還必須改變你打開它的方式,因爲你已經爲'isEditable'傳遞了'false'。 –

回答

1

你可能想看看the docs並在this How To,因爲大部分適用於這裏。

首先,當你打開SpreadsheetDocument,第二個參數應該是true

第二個參數是真或假,並表示是否要進行編輯要打開的文件。如果此參數爲假,您對文檔所做的任何更改都不會被保存

其次,您需要在Workbook之後調用Save刪除名稱後。

第三,SpreadsheetDocument執行IDisposable。您應該用using聲明包裝它,以確保在您完成聲明後處置它。這將確保更改被刷新並關閉文件流。從the docs開始配置:

刷新並保存內容,關閉文件,並釋放所有資源。

+0

感謝您的幫助 –

+0

我的using語句包含哪些內容? –

+0

@CraigGallagher在文檔上工作的所有代碼。像[How to]中的示例一樣(https://msdn.microsoft.com/en-us/library/office/cc861607.aspx#sectionSection3)(有一個小錯字,'using'是小寫字母)。 –