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

如何将复杂Excel文档转换为C#模型及最优模型结构咨询

层级化品类Excel转C#模型的最优方案

嵌套Dictionary的适用性分析

嵌套Dictionary(比如Dictionary<string, Dictionary<string, decimal>>这类)能快速实现层级映射,但仅适合临时验证场景,生产环境不推荐:

  • 无类型校验,读写时易出现键名拼写错误
  • 无法直接绑定UI或序列化(如JSON),需额外转换
  • 层级结构固定,后续扩展新层级必须修改整体结构

推荐的强类型嵌套模型

针对层级化品类(例:品类组→二级品类→三级品类→数值),优先使用强类型嵌套类结构,示例如下:

// 底层数值数据类
public class CategoryValue
{
    public decimal SalesAmount { get; set; }
    public int SalesCount { get; set; }
    // 可按需添加成本、毛利率等字段
}

// 三级品类节点
public class ThirdCategory
{
    public string Name { get; set; }
    public CategoryValue Values { get; set; }
}

// 二级品类节点
public class SecondCategory
{
    public string Name { get; set; }
    public List<ThirdCategory> SubCategories { get; set; } = new List<ThirdCategory>();
}

// 顶级品类组
public class CategoryGroup
{
    public string Name { get; set; }
    public List<SecondCategory> SubCategories { get; set; } = new List<SecondCategory>();
}

// Excel数据根模型
public class CategoryDataRoot
{
    public List<CategoryGroup> Groups { get; set; } = new List<CategoryGroup>();
}

该结构优势:

  • 编译期类型校验,提前规避错误
  • 原生支持序列化/反序列化,方便存储与传输
  • 层级扩展灵活,新增四级品类仅需新增类并在对应层级添加List
  • 可读性与维护性远高于Dictionary

结合EPPlus的读取逻辑示例

假设Excel结构为:

第1行:品类组名称
第2行:二级品类名称
第3行:三级品类名称
第4行及以下:数值列(销售额、销量等)

核心读取逻辑:

using OfficeOpenXml;
using System.IO;

var filePath = "你的Excel文件路径.xlsx";
var root = new CategoryDataRoot();

using var package = new ExcelPackage(new FileInfo(filePath));
var worksheet = package.Workbook.Worksheets[0];

// 遍历品类组(按列划分区域)
int currentGroupCol = 1;
while (worksheet.Cells[1, currentGroupCol].Value != null)
{
    var group = new CategoryGroup { Name = worksheet.Cells[1, currentGroupCol].Text };

    // 遍历二级品类
    int currentSecondCatRow = 2;
    while (worksheet.Cells[currentSecondCatRow, currentGroupCol].Value != null)
    {
        var secondCat = new SecondCategory { Name = worksheet.Cells[currentSecondCatRow, currentGroupCol].Text };

        // 遍历三级品类及数值
        int currentThirdCatRow = 3;
        while (worksheet.Cells[currentThirdCatRow, currentGroupCol].Value != null)
        {
            var thirdCat = new ThirdCategory
            {
                Name = worksheet.Cells[currentThirdCatRow, currentGroupCol].Text,
                Values = new CategoryValue
                {
                    SalesAmount = decimal.Parse(worksheet.Cells[currentThirdCatRow, currentGroupCol + 1].Text),
                    SalesCount = int.Parse(worksheet.Cells[currentThirdCatRow, currentGroupCol + 2].Text)
                }
            };
            secondCat.SubCategories.Add(thirdCat);
            currentThirdCatRow++;
        }
        group.SubCategories.Add(secondCat);
        currentSecondCatRow += currentThirdCatRow - 3; // 跳过已读取的三级品类行
    }
    root.Groups.Add(group);
    currentGroupCol += 3; // 假设每组占3列:品类名+销售额+销量
}

注:实际逻辑需根据你的Excel真实结构调整,比如合并单元格处理、空行判断等。

适配可变层级的通用模型

如果Excel品类层级不固定(部分品类2级,部分4级),可使用递归嵌套的通用类:

public class GenericCategory
{
    public string Name { get; set; }
    public CategoryValue Values { get; set; } // 仅叶子节点存数值
    public List<GenericCategory> SubCategories { get; set; } = new List<GenericCategory>();
}

public class GenericCategoryRoot
{
    public List<GenericCategory> Categories { get; set; } = new List<GenericCategory>();
}

读取时用递归方法遍历Excel行/列即可适配任意层级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:08:08