修改Excel定义的名称

时间:2015-05-15 19:08:07

标签: c# asp.net excel openxml

我必须使用 OpenXml 重命名Excel工作表,但完成后,对这些工作表的引用将不再有效。我一直在尝试使用 OpenXml 更改innerXml DefinedName,但它不会设置该值。 这就是我到目前为止所拥有的:

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,因为我读过可能会解决这个问题,但事实并非如此。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

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

只要执行第(1)行,上面三行就会更改工作表名称  var names = wbPart.Workbook.DefinedNames.Where(x =&gt; x.InnerText.ToString()。包含(&#34;&#39;&#34; + sheetName +&#34;&#39;&# 34));

行将抛出一个空引用异常,因为名称将被更改。

在任何情况下,excel都没有两张相同的DefinedNames,所以哪里会返回一张,因此不需要循环。用户FirstOrDefault()而不是while。