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

如何通过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文件。大致步骤:

  1. 创建[Content_Types].xml:定义压缩包内所有文件的类型
  2. 创建xl/workbook.xml:定义工作簿的基本信息,以及两个工作表的关联
  3. 创建xl/worksheets/sheet1.xml和xl/worksheets/sheet2.xml:分别编写两个工作表的具体内容(表头、数据行)
  4. 创建xl/_rels/workbook.xml.rels:建立工作簿和工作表的关联关系
  5. 将所有文件打包成ZIP,把后缀改为.xlsx

不过这种方式非常繁琐,容易出错,只适合想深入了解OpenXML结构的场景,日常开发还是推荐用SDK。

内容的提问来源于stack exchange,提问作者Adhil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:29