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

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

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

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

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

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K