问题插入页脚在Excel中 – OpenXML

我发送Excel文件作为内存stream,编辑它们,然后将它们发送回浏览器,以便它们在客户端办公程序(Microsoft Excel)中打开。 在编辑过程中,我在工作簿中的所有Excel工作表上添加页脚。 页脚的插入在大多数情况下都是这样工作的,但是如果我编辑的Excel文件有很多带有graphics等的“复杂”工作表,它就会失败。 这是我用来插入页脚的代码

// Adds footer to all sheets in the workbook except the one inserted by code private static void AddFooterToAllSheets(SpreadsheetDocument spreadSheetDocument, string footerText, string sheetTitle) { var workbookPart = spreadSheetDocument.WorkbookPart; var workbook = spreadSheetDocument.WorkbookPart.Workbook; var sheetIndex = 0; //variable worksheetpart is not used in code, but added here because of looping foreach (var worksheetpart in workbook.WorkbookPart.WorksheetParts) { string sheetName = workbookPart.Workbook.Descendants<Sheet>().ElementAt(sheetIndex).Name; if (sheetName.Equals(sheetTitle)) { sheetIndex++; continue; } InsertHeaderFooter(spreadSheetDocument, sheetName, footerText, HeaderType.AllFooter); sheetIndex++; } } public static void InsertHeaderFooter(SpreadsheetDocument document, string sheetName, string textToInsert, HeaderType type) { var wbPart = document.WorkbookPart; // Find the sheet with the supplied name, and then use // that Sheet object to retrieve a reference to // the appropriate worksheet. var theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault(); if (theSheet == null) { return; } var wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id)); var ws = wsPart.Worksheet; // Worksheet is nothing? You have a damaged workbook! if (ws == null) { return; } // Retrieve a reference to the header/footer node, if it exists. var hf = ws.Descendants<HeaderFooter>().FirstOrDefault(); if (hf == null) { hf = new HeaderFooter(); ws.AppendChild<HeaderFooter>(hf); } // The HeaderFooter node should be there, at this point! if (hf != null) { // You've found the node. Now add the header or footer. // Deal with the attributes first: switch (type) { case HeaderType.EvenHeader: case HeaderType.EvenFooter: case HeaderType.OddHeader: case HeaderType.OddFooter: // Even or odd only? Add a differentOddEven attribute and set // it to "1". hf.DifferentOddEven = true; break; case HeaderType.FirstFooter: case HeaderType.FirstHeader: hf.DifferentFirst = true; break; } switch (type) { // This code creates new header elements, even if they // already exist. Either way, you end up with a // "fresh" element. case HeaderType.AllHeader: hf.EvenHeader = new EvenHeader { Text = textToInsert }; hf.OddHeader = new OddHeader { Text = textToInsert }; break; case HeaderType.AllFooter: hf.EvenFooter = new EvenFooter { Text = textToInsert }; hf.OddFooter = new OddFooter { Text = textToInsert }; break; case HeaderType.EvenFooter: hf.EvenFooter = new EvenFooter { Text = textToInsert }; break; case HeaderType.EvenHeader: hf.EvenHeader = new EvenHeader { Text = textToInsert }; break; case HeaderType.OddFooter: hf.OddFooter = new OddFooter { Text = textToInsert }; break; case HeaderType.OddHeader: hf.OddHeader = new OddHeader { Text = textToInsert }; break; case HeaderType.FirstHeader: hf.FirstHeader = new FirstHeader { Text = textToInsert }; break; case HeaderType.FirstFooter: hf.FirstFooter = new FirstFooter { Text = textToInsert }; break; } } ws.Save(); } 

试图打开文档给我一个消息,说明Excel文件已损坏。 在validation损坏的文件时,我在Open XML SDK 2.5生产力工具中得到的错误是这样的:

错误节点types:Worskheet错误部分:/xl/worksheets/sheet2.xml错误节点path:/ x:工作表[1]相关节点types:HeaderFooter

说明:该元素具有意外的子元素“ http://schemas.openxmlformats.org/spreadsheetml/2006/main:headerFooter ”。

任何帮助表示赞赏。