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

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

2025-06-27 23:47:24作者:郦嵘贵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. 模板中的属性路径与数据结构匹配

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

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

项目优选

收起
kernelkernel
deepin linux kernel
C
27
11
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
466
3.47 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
10
1
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
65
19
flutter_flutterflutter_flutter
暂无简介
Dart
715
172
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
23
0
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
203
81
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.26 K
695
rainbondrainbond
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
15
1
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
1