2015-05-15 3 views
0

Мне нужно переименовать листы Excel с помощью OpenXml, но когда это будет сделано, ссылки на эти листы больше не будут работать. Я пытался изменить innerXmlDefinedName с использованием OpenXml, но он не установит значение. Вот что я до сих пор:Изменить определенное имя 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(); 
    } 

} 

Я использую время цикла вместо Еогеасп, потому что я прочитал, что может решить эту проблему, но это не так. Любая помощь будет большой.

+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) будет выполняться имена Var = wbPart.Workbook.DefinedNames.Where (х => x.InnerText.ToString(). Содержит (» '"+ sheetName +"' "));

строка будет выбрасывать исключение нулевой ссылки, так как имя будет изменено.

И в любом случае excel не имеет одинаковых DefinedNames для двух листов, поэтому, где будет возвращен один лист, следовательно, цикл не нужен. User FirstOrDefault() вместо времени.

Смежные вопросы