使用Open XML生成多Sheet Excel时遇数据异常及修复提示
问题分析与修复方案
核心问题点
- Sheet2数据添加逻辑错误:你试图在同一个
Row对象中添加属于不同行的单元格(A1和A2),这不符合Open XML的结构规范——同一Row应对应Excel中的一行,单元格需属于同一行的不同列;若要添加多行,需创建多个Row对象。 - 未显式保存Workbook:创建完所有内容后,未调用Workbook的保存方法,导致部分内容未写入流。
- Row未设置RowIndex:未给
Row对象指定RowIndex属性,Excel解析时易出现结构异常,触发修复提示。 - 重复单元格引用(Sheet2):同一
Row中加入两个不同行的单元格,造成单元格引用冲突,是修复提示的直接诱因。
修正后的代码
MemoryStream ms = new MemoryStream(); SpreadsheetDocument xl = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook); byte[] dt = null; // 添加WorkbookPart并初始化 WorkbookPart workbookPart = xl.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); Sheets sheets = workbookPart.Workbook.AppendChild<Sheets>(new Sheets()); // Sheet1 创建逻辑 WorksheetPart worksheetPart1 = workbookPart.AddNewPart<WorksheetPart>(); Worksheet workSheet1 = new Worksheet(); SheetData sheetData1 = new SheetData(); // Sheet1添加1行数据 Row row1 = new Row { RowIndex = 1 }; // 显式设置行号 Cell cell1 = CreateTextCell("A", "111", 1); row1.Append(cell1); sheetData1.Append(row1); workSheet1.Append(sheetData1); worksheetPart1.Worksheet = workSheet1; Sheet sheet1 = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart1), SheetId = 1, Name = "Sheet1" }; sheets.Append(sheet1); // Sheet2 创建逻辑 WorksheetPart worksheetPart2 = workbookPart.AddNewPart<WorksheetPart>(); Worksheet workSheet2 = new Worksheet(); SheetData sheetData2 = new SheetData(); // Sheet2添加2行数据 // 第一行 Row row2 = new Row { RowIndex = 1 }; Cell cell2 = CreateTextCell("A", "data", 1); row2.Append(cell2); sheetData2.Append(row2); // 第二行 Row row3 = new Row { RowIndex = 2 }; Cell cell3 = CreateTextCell("A", "data", 2); row3.Append(cell3); sheetData2.Append(row3); workSheet2.Append(sheetData2); worksheetPart2.Worksheet = workSheet2; Sheet sheet2 = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart2), SheetId = 2, Name = "Sheet2" }; sheets.Append(sheet2); // 关键:保存Workbook内容 workbookPart.Workbook.Save(); xl.Close(); dt = ms.ToArray(); // 保留原CreateTextCell方法 public Cell CreateTextCell(string header, string text, int index) { Cell c = new Cell(); c.DataType = CellValues.InlineString; c.CellReference = header + index; InlineString inlineString = new InlineString(); Text t = new Text(); t.Text = text; inlineString.AppendChild(t); c.AppendChild(inlineString); return c; }
额外说明
- 若需要在同一行添加多列数据,只需在同一个
Row对象中添加不同列的单元格(比如CreateTextCell("A", "col1", 1)和CreateTextCell("B", "col2", 1))。 - 显式设置
RowIndex和CellReference能避免Excel解析时的结构歧义,减少修复提示的出现。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

