如何通过XML文件创建包含两个工作表的工作簿
嘿,我来帮你搞定用XML创建带两个工作表的工作簿这件事!你目前的字典数据已经按0和1后缀分好组了,刚好对应两个工作表,下面我给你两种实现方式,一种是用官方的OpenXML SDK(最省心高效),另一种是手动编写XML结构(适合深入理解原理):
方式一:使用OpenXML SDK(推荐)
OpenXML是微软官方的库,专门用于处理Office文档(本质就是XML格式的压缩包),能帮你省去手动编写复杂XML结构的麻烦。
步骤1:安装依赖
先通过NuGet安装OpenXML SDK包:
Install-Package DocumentFormat.OpenXml
步骤2:完整代码实现
下面的代码会把你的字典数据按后缀拆分,分别填充到两个工作表中,最终生成标准的Excel工作簿:
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System.Collections.Generic; using System.Linq; public void WriteToXml() { // 你的原始数据字典(这里给了一些测试数据,你可以替换成自己的) Dictionary<string, List<int>> Table = new Dictionary<string, List<int>>(); Table.Add("A0", new List<int> { 1, 2, 3 }); Table.Add("B0", new List<int> { 4, 5, 6 }); Table.Add("C0", new List<int> { 7, 8, 9 }); Table.Add("D0", new List<int> { 10, 11, 12 }); Table.Add("A1", new List<int> { 13, 14, 15 }); Table.Add("B1", new List<int> { 16, 17, 18 }); Table.Add("C1", new List<int> { 19, 20, 21 }); Table.Add("D1", new List<int> { 22, 23, 24 }); // 创建Excel文件(路径可自定义) using (SpreadsheetDocument doc = SpreadsheetDocument.Create("TwoSheetsWorkbook.xlsx", SpreadsheetDocumentType.Workbook)) { // 添加工作簿核心部分 WorkbookPart workbookPart = doc.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); // 创建第一个工作表:Sheet0 WorksheetPart sheetPart1 = workbookPart.AddNewPart<WorksheetPart>(); sheetPart1.Worksheet = new Worksheet(new SheetData()); Sheet sheet1 = new Sheet { Id = doc.WorkbookPart.GetIdOfPart(sheetPart1), SheetId = 1, Name = "Sheet0" }; // 创建第二个工作表:Sheet1 WorksheetPart sheetPart2 = workbookPart.AddNewPart<WorksheetPart>(); sheetPart2.Worksheet = new Worksheet(new SheetData()); Sheet sheet2 = new Sheet { Id = doc.WorkbookPart.GetIdOfPart(sheetPart2), SheetId = 2, Name = "Sheet1" }; // 将两个工作表关联到工作簿 workbookPart.Workbook.Append(new Sheets(sheet1, sheet2)); // 填充第一个工作表(取键结尾为0的数据) PopulateSheetData(sheetPart1, Table, "0"); // 填充第二个工作表(取键结尾为1的数据) PopulateSheetData(sheetPart2, Table, "1"); workbookPart.Workbook.Save(); } } // 辅助方法:给指定工作表填充数据 private void PopulateSheetData(WorksheetPart sheetPart, Dictionary<string, List<int>> data, string sheetSuffix) { SheetData sheetData = sheetPart.Worksheet.GetFirstChild<SheetData>(); // 先添加表头行 Row headerRow = new Row(); foreach (var key in data.Keys.Where(k => k.EndsWith(sheetSuffix))) { Cell headerCell = new Cell { CellValue = new CellValue(key), DataType = new EnumValue<CellValues>(CellValues.String) }; headerRow.Append(headerCell); } sheetData.Append(headerRow); // 找到最长的数据列表长度,确保所有行都能对齐填充 int maxRowCount = data.Values .Where(v => data.Keys.First(k => data[k] == v).EndsWith(sheetSuffix)) .Max(l => l.Count); // 逐行添加数据 for (int rowIndex = 0; rowIndex < maxRowCount; rowIndex++) { Row dataRow = new Row(); foreach (var key in data.Keys.Where(k => k.EndsWith(sheetSuffix))) { Cell dataCell = new Cell(); if (rowIndex < data[key].Count) { dataCell.CellValue = new CellValue(data[key][rowIndex].ToString()); dataCell.DataType = new EnumValue<CellValues>(CellValues.Number); } else { // 数据不足时添加空单元格 dataCell.CellValue = new CellValue(string.Empty); dataCell.DataType = new EnumValue<CellValues>(CellValues.String); } dataRow.Append(dataCell); } sheetData.Append(dataRow); } }
代码说明
SpreadsheetDocument是创建/操作Excel的入口类,它会自动处理XML结构的打包- 每个工作表对应一个
WorksheetPart,需要关联到工作簿的Sheets集合才能被识别 - 辅助方法
PopulateSheetData负责按后缀筛选数据,自动生成表头和数据行,还处理了数据长度不一致的情况
方式二:手动编写XML结构(了解原理用)
如果你想完全手动实现,需要遵循Office Open XML规范,Excel本质是一个ZIP压缩包,里面包含多个XML文件。大致步骤:
- 创建
[Content_Types].xml:定义压缩包内所有文件的类型 - 创建
xl/workbook.xml:定义工作簿的基本信息,以及两个工作表的关联 - 创建
xl/worksheets/sheet1.xml和xl/worksheets/sheet2.xml:分别编写两个工作表的具体内容(表头、数据行) - 创建
xl/_rels/workbook.xml.rels:建立工作簿和工作表的关联关系 - 将所有文件打包成ZIP,把后缀改为
.xlsx
不过这种方式非常繁琐,容易出错,只适合想深入了解OpenXML结构的场景,日常开发还是推荐用SDK。
内容的提问来源于stack exchange,提问作者Adhil
相关产品推荐
相关产品推荐

