2016-12-02 57 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'是小写字母)。 –