EasyExcel模板填充数据问题解析与解决方案
问题背景
在使用阿里巴巴开源的EasyExcel库进行Excel操作时,开发者经常需要先创建Excel模板,然后基于模板填充数据。然而在实际开发中,很多开发者会遇到模板填充数据不成功的情况,特别是在使用内存流作为模板源时。
常见错误场景
从示例代码中可以看到,开发者尝试了以下操作:
- 首先通过
createExcelTemplate
方法创建了一个包含三列(h1,h2,h3)的Excel模板 - 将模板保存到ByteArrayOutputStream中,转换为字节数组
- 然后尝试用这个字节数组作为模板源,填充数据
但最终发现数据并没有成功填充到目标Excel文件中。
问题根本原因
经过分析,这个问题主要有两个关键点:
-
数据结构不匹配:EasyExcel的模板填充机制对于不同类型的数据结构有不同的处理方式。原代码中使用的是
Map<String, List<Double>>
结构,而EasyExcel期望的是List<Map<String,Double>>
结构。 -
模板标记格式:在创建模板时,单元格内容应该使用
{.字段名}
的格式来标记填充位置,而不是直接将字段名放在单元格中。
正确解决方案
1. 修正数据结构
正确的数据结构应该是List<Map<String,Object>>
,其中每个Map代表一行数据,Map中的键对应模板中的字段名,值对应要填充的数据。
public static List<Map<String,Double>> createCorrectData() {
List<Map<String,Double>> data = new ArrayList<>();
// 第一行数据
Map<String,Double> row1 = new HashMap<>();
row1.put("h1", 1.2);
row1.put("h2", 1.3);
row1.put("h3", 1.4);
data.add(row1);
// 第二行数据
Map<String,Double> row2 = new HashMap<>();
row2.put("h1", 2.1);
row2.put("h2", 2.2);
row2.put("h3", 2.3);
data.add(row2);
return data;
}
2. 修正模板创建方式
在创建模板时,应该确保单元格内容正确标记了填充位置:
public static void createCorrectTemplate(OutputStream outputStream) {
// 创建表头
List<List<String>> head = new ArrayList<>();
head.add(Collections.singletonList("标题1"));
head.add(Collections.singletonList("标题2"));
head.add(Collections.singletonList("标题3"));
// 创建模板内容 - 使用{.字段名}标记填充位置
List<List<String>> data = new ArrayList<>();
data.add(Arrays.asList("{.h1}", "{.h2}", "{.h3}"));
EasyExcel.write(outputStream)
.head(head)
.sheet("Sheet1")
.doWrite(data);
}
3. 完整的使用示例
public static void main(String[] args) throws IOException {
// 创建模板到内存流
ByteArrayOutputStream templateStream = new ByteArrayOutputStream();
createCorrectTemplate(templateStream);
byte[] templateBytes = templateStream.toByteArray();
// 准备填充数据
List<Map<String, Double>> dataToFill = createCorrectData();
// 执行模板填充
FileOutputStream outputFile = new FileOutputStream("filled_template.xlsx");
ExcelWriter excelWriter = EasyExcel.write(outputFile)
.withTemplate(new ByteArrayInputStream(templateBytes))
.build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(dataToFill, writeSheet);
excelWriter.finish();
}
高级用法
除了基本的数据填充,EasyExcel还支持更复杂的模板操作:
-
多列表格填充:可以通过在模板中设置多个填充标记,然后传入多个数据集合
-
表格行扩展:在模板中使用
$
符号标记需要扩展的行,EasyExcel会自动根据数据量扩展行数 -
条件格式:可以在模板中设置条件格式,填充时会保留这些格式
-
公式支持:模板中的公式在填充后仍然有效
性能优化建议
-
模板缓存:对于频繁使用的模板,可以将其缓存在内存中,避免重复创建
-
批量处理:当数据量很大时,可以考虑分批填充,避免内存溢出
-
流式处理:使用EasyExcel的流式API处理大数据量场景
总结
EasyExcel的模板填充功能非常强大,但需要正确理解其数据结构和模板标记的用法。通过本文的分析和示例,开发者可以掌握模板填充的正确方法,避免常见的错误。在实际项目中,合理使用模板填充可以大大提高Excel操作的效率和代码的可维护性。
- DDeepSeek-V3.1-BaseDeepSeek-V3.1 是一款支持思考模式与非思考模式的混合模型Python00
- QQwen-Image-Edit基于200亿参数Qwen-Image构建,Qwen-Image-Edit实现精准文本渲染与图像编辑,融合语义与外观控制能力Jinja00
GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~042CommonUtilLibrary
快速开发工具类收集,史上最全的开发工具类,欢迎Follow、Fork、StarJava03GitCode百大开源项目
GitCode百大计划旨在表彰GitCode平台上积极推动项目社区化,拥有广泛影响力的G-Star项目,入选项目不仅代表了GitCode开源生态的蓬勃发展,也反映了当下开源行业的发展趋势。06GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00openHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!C0295- WWan2.2-S2V-14B【Wan2.2 全新发布|更强画质,更快生成】新一代视频生成模型 Wan2.2,创新采用MoE架构,实现电影级美学与复杂运动控制,支持720P高清文本/图像生成视频,消费级显卡即可流畅运行,性能达业界领先水平Python00
- GGLM-4.5-AirGLM-4.5 系列模型是专为智能体设计的基础模型。GLM-4.5拥有 3550 亿总参数量,其中 320 亿活跃参数;GLM-4.5-Air采用更紧凑的设计,拥有 1060 亿总参数量,其中 120 亿活跃参数。GLM-4.5模型统一了推理、编码和智能体能力,以满足智能体应用的复杂需求Jinja00
Yi-Coder
Yi Coder 编程模型,小而强大的编程助手HTML013
热门内容推荐
最新内容推荐
项目优选









