如何使用C#代码将数据拆分写入Excel的多个工作表中
问题原因
你的代码核心错误出在工作表实例的创建逻辑上:
- 你在循环创建工作表前仅创建了1个
WorksheetPart和对应的Worksheet对象,循环内所有Sheet标签都绑定了同一个WorksheetPart的ID,本质上所有工作表标签都指向同一份工作表数据 - 所有表头、行数据都被追加到了同一个
Worksheet的SheetData集合中,每次循环都是往同一份数据里累加内容,最终所有标签打开看到的都是全量累加后的数据
修复方案
将工作表实例的创建逻辑移到循环内部,每次生成分片时都创建独立的工作表实例,绑定到对应的Sheet标签上,修改后的代码如下:
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filename, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets()); for (int i = 0; i < Amount; i++) { // 每次循环创建独立的工作表实例 WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); var workSheet = worksheetPart.Worksheet; Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), // 绑定当前新工作表的ID SheetId = ((uint)(i + 1)), Name = "Data" + (i + 1) }; sheets.Append(sheet); var HeadRow = workSheet.GetFirstChild<SheetData>().AppendChild(new Row()); HeadRow.AppendChild(new Cell() { CellValue = new CellValue("Type"), DataType = new EnumValue<CellValues>(CellValues.String) }); HeadRow.AppendChild(new Cell() { CellValue = new CellValue("Description"), DataType = new EnumValue<CellValues>(CellValues.String) }); HeadRow.AppendChild(new Cell() { CellValue = new CellValue("Time"), DataType = new EnumValue<CellValues>(CellValues.String) }); HeadRow.AppendChild(new Cell() { CellValue = new CellValue("Date"), DataType = new EnumValue<CellValues>(CellValues.String) }); for (int j = 0 + (i * (int)OrgAmount); j < ((i + 1) * (int)OrgAmount); j++) { if (j == LineCount) { break; } var row = workSheet.GetFirstChild<SheetData>().AppendChild(new Row()); var cell1 = row.AppendChild(new Cell()); var cell2 = row.AppendChild(new Cell()); var cell3 = row.AppendChild(new Cell()); var cell4 = row.AppendChild(new Cell()); cell1.CellValue = new CellValue(LineType[j]); cell1.DataType = new EnumValue<CellValues>(CellValues.String); cell2.CellValue = new CellValue(LineDesc[j]); cell2.DataType = new EnumValue<CellValues>(CellValues.String); cell3.CellValue = new CellValue(LineTime[j]); cell3.DataType = new EnumValue<CellValues>(CellValues.String); cell4.CellValue = new CellValue(LineDate[j]); cell4.DataType = new EnumValue<CellValues>(CellValues.String); } } workbookPart.Workbook.Save(); // 所有工作表生成完成后统一保存即可 spreadsheetDocument.Close(); }
内容的提问来源于stack exchange,提问作者Stratofighter
相关产品推荐
相关产品推荐

