首页
/ MiniExcel模板填充:动态列数据的正确处理方法

MiniExcel模板填充:动态列数据的正确处理方法

2025-06-27 20:40:19作者:郦嵘贵Just

在使用MiniExcel进行Excel模板填充时,开发者经常会遇到需要动态填充多列数据的情况。本文将通过一个典型场景,深入分析如何正确处理模板中多列数据的动态填充问题。

问题场景分析

假设我们有一个Excel模板,包含两列数据需要填充:

  • 第一列:{{model.name}}
  • 第二列:{{manufacturer.name}}

期望的填充结果是:

A1 B1
A2 B2
A3 B3
A4 B4

常见错误做法

错误方法一:分离数据源

开发者可能会尝试将两列数据分别放在不同的字典键中:

var value = new Dictionary<string, object>
{
    ["model"] = new[] { new { name = "A1" }, new { name = "A2" } },
    ["manufacturer"] = new[] { new { name = "B1" }, new { name = "B2" } }
};

这种做法的结果是错误的,因为MiniExcel会将每个数据源独立展开,导致数据错位。

错误方法二:多次填充

另一种尝试是分多次调用SaveAsByTemplateAsync方法:

// 第一次填充model
await memoryStream.SaveAsByTemplateAsync(copiedData, new { model = models });

// 第二次填充manufacturer
await clonedStream.SaveAsByTemplateAsync(copiedData1, new { manufacturer = manufacturers });

这种方法会产生笛卡尔积,导致数据重复组合。

正确解决方案

使用统一数据对象

正确的做法是将每行数据作为一个整体对象,包含所有需要填充的属性:

// 创建动态对象数组
dynamic[] objects = Enumerable.Range(0, 4)
    .Select(x => new ExpandoObject())
    .ToArray();

// 填充每行数据
for (int i = 0; i < 4; i++)
{
    var obj = objects[i];
    obj.model = new { name = $"A{i + 1}" };
    obj.manufacturer = new { name = $"B{i + 1}" };
}

// 构建数据源
var value = new Dictionary<string, object>
{
    ["data"] = objects
};

对应的模板应修改为:

{{data.model.name}} {{data.manufacturer.name}}

替代方案:使用字典

如果不喜欢动态对象,可以使用字典:

var rows = new List<Dictionary<string, object>>();
for (int i = 0; i < 4; i++)
{
    var row = new Dictionary<string, object>
    {
        ["model"] = new { name = $"A{i + 1}" },
        ["manufacturer"] = new { name = $"B{i + 1}" }
    };
    rows.Add(row);
}

var value = new Dictionary<string, object>
{
    ["data"] = rows
};

技术原理

MiniExcel的模板引擎要求:

  1. 每行数据必须是一个完整的对象
  2. 模板中的属性路径必须能够从同一个对象解析
  3. 数组数据会按行展开

理解这些原则后,就能正确设计数据结构和模板,实现预期的填充效果。

总结

处理MiniExcel模板填充时,关键是要确保:

  1. 每行数据包含所有需要填充的字段
  2. 使用统一的数据对象结构
  3. 模板中的属性路径与数据结构匹配

通过合理设计数据模型,可以轻松实现复杂的动态列填充需求。

登录后查看全文
热门项目推荐