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