修改Excel'定义的名称

本文关键字:定义 Excel 修改 | 更新日期: 2023-09-27 17:49:23

我必须使用OpenXml重命名Excel表,但当这是完成这些表的引用将不再工作。我一直试图改变DefinedNameinnerXml使用OpenXml,但它不会设置值。以下是目前为止的内容:

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,因为我读到这可能会解决这个问题,但它没有。

修改Excel'定义的名称

   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。其中(x => x. innertext . tostring()。Contains("'"+ sheetName +"'"));

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

在任何情况下,excel没有相同的DefinedNames为两个表,所以哪里将返回一个表,因此while循环不需要。用户FirstOrDefault()代替while.