You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:15:30