如何将复杂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
相关产品推荐
相关产品推荐

