MiniExcel无法动态填充Excel标签问题求助
动态填充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" }, new { name = "A3" }, new { name = "A4" } }, ["manufacturer"] = new[] { new { name = "B1" }, new { name = "B2" }, new { name = "B3" }, new { name = "B4" }, }, };
模板内容:
{{model.name}} {{manufacturer.name}}
实际输出:
B1 {{manufacturer.name}} B2 {{manufacturer.name}} B3 {{manufacturer.name}} B4 {{manufacturer.name}}
问题:模板引擎仅遍历最后传入的数组(manufacturer),忽略了model数组的遍历逻辑。
实现二:多次调用填充方法
代码:
MemoryStream memoryStream = new MemoryStream(0); memoryStream.Write(bytes, 0, bytes.Length); var value = new Dictionary<string, object> { ["model"] = new[] { new { name = "A1" }, new { name = "A2" }, new { name = "A3" }, new { name = "A4" } }, }; byte[] copiedData = memoryStream.ToArray(); await memoryStream.SaveAsByTemplateAsync(copiedData, value); memoryStream.Position = 0; MemoryStream clonedStream = new MemoryStream(); await memoryStream.CopyToAsync(clonedStream); clonedStream.Position = 0; await memoryStream.DisposeAsync(); byte[] copiedData1 = clonedStream.ToArray(); var value1 = new Dictionary<string, object> { ["manufacturer"] = new[] { new { name = "B1" }, new { name = "B2" }, new { name = "B3" }, new { name = "B4" } }, }; await clonedStream.SaveAsByTemplateAsync(copiedData1, value1);
实际输出:
A1 B1 A1 B2 A1 B3 A1 B4 A2 B1 A2 B2 A2 B3 A2 B4 A3 B1 A3 B2 A3 B3 A3 B4 A4 B1 A4 B2 A4 B3 A4 B4
问题:两次填充产生笛卡尔积,而非按索引一一配对。
正确解决方案
核心思路是将两个数组的元素按索引一一配对,包装成统一的对象数组,让模板引擎遍历这个数组时能同时获取对应位置的model和manufacturer数据。
代码实现
// 准备原始数据源 var models = new[] { new { name = "A1" }, new { name = "A2" }, new { name = "A3" }, new { name = "A4" } }; var manufacturers = new[] { new { name = "B1" }, new { name = "B2" }, new { name = "B3" }, new { name = "B4" } }; // 使用Zip方法按索引配对,生成包含对应model和manufacturer的对象数组 var pairedItems = models.Zip(manufacturers, (model, manufacturer) => new { model = model, manufacturer = manufacturer }).ToArray(); // 构造模板参数 var templateData = new Dictionary<string, object> { ["items"] = pairedItems };
修改模板内容
将原模板改为遍历配对后的数组:
{{items.model.name}} {{items.manufacturer.name}}
效果验证
填充后会得到预期的一一对应结果:
A1 B1 A2 B2 A3 B3 A4 B4
注意事项
- 如果
models和manufacturers数组长度不一致,Zip方法会以较短数组的长度为准,多余元素会被忽略。若需处理这种情况,可手动补全较短数组的元素,或在配对时添加判断逻辑。 - 若无法修改模板格式,需自定义模板引擎的遍历逻辑,通过索引同时访问两个数组的对应元素进行填充。
内容的提问来源于stack exchange,提问作者darkblue
相关产品推荐
相关产品推荐

