JeecgBoot数据导入导出:Excel处理与模板定制
你是否还在为企业级应用中的Excel数据处理烦恼?手动编写导入导出代码耗时费力,格式转换容易出错,模板定制更是无从下手?本文将带你一文掌握JeecgBoot框架的Excel数据处理全流程,从基础导入导出到高级模板定制,让你轻松应对各类数据管理场景。读完本文后,你将能够:快速实现Excel数据导入导出功能、定制符合业务需求的Excel模板、处理复杂数据转换与校验逻辑。
一、JeecgBoot Excel处理核心机制
JeecgBoot采用注解驱动的Excel处理模式,通过@Excel注解实现Java对象与Excel表格的映射,结合ExcelImportUtil和ExcelExportUtil工具类完成数据转换。这种设计极大简化了开发流程,开发者无需关注底层POI操作细节,只需专注业务逻辑实现。
1.1 注解驱动的对象映射
核心注解@Excel可配置字段与Excel列的对应关系,支持数据格式化、字典转换、图片处理等功能。例如用户信息导出实体类:
public class SysUserExportVo {
@Excel(name = "登录账号", width = 15)
private String username;
@Excel(name = "真实姓名", width = 15)
private String realname;
@Excel(name = "生日", width = 15, format = "yyyy-MM-dd")
private Date birthday;
@Excel(name = "性别", width = 15, dicCode = "sex")
private Integer sex;
}
1.2 通用导入导出控制器
框架提供JeecgController基类封装了标准导入导出逻辑,子类只需继承即可获得完整功能。核心代码如下:
public class JeecgController<T, S extends IService<T>> extends BaseController<T, S> {
// 导出Excel
@GetMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, T entity) {
// 实现逻辑...
}
// 导入Excel
@PostMapping(value = "/importExcel")
public Result<?> importExcel(HttpServletRequest request, MultipartFile file) {
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(1);
List<T> list = ExcelImportUtil.importExcel(file.getInputStream(), clazz, params);
// 数据校验与保存...
}
}
二、Excel数据导入实战
2.1 标准导入流程
JeecgBoot数据导入采用三步式处理流程:上传文件解析→数据校验→业务处理,完美适配各类企业级数据导入场景。
用户导入实现示例(以系统用户为例):
@PostMapping(value = "/importExcel")
public Result<?> importExcel(HttpServletRequest request, MultipartFile file) {
ImportParams params = new ImportParams();
params.setTitleRows(1);
params.setHeadRows(1);
List<SysUserImportVo> list = ExcelImportUtil.importExcel(
file.getInputStream(), SysUserImportVo.class, params);
// 数据校验
List<String> errorMsg = new ArrayList<>();
for (SysUserImportVo user : list) {
if (StringUtils.isEmpty(user.getUsername())) {
errorMsg.add("用户名不能为空");
}
// 更多校验规则...
}
if (!errorMsg.isEmpty()) {
return Result.error("导入失败:" + String.join(",", errorMsg));
}
// 批量保存
userService.importUser(list);
return Result.ok("导入成功,共" + list.size() + "条数据");
}
2.2 字典与关联数据处理
导入时支持通过@Dict注解自动完成字典编码到文本的转换,例如部门信息导入:
public class SysDepartExportVo {
@Excel(name="机构类别",width=15,dicCode="org_category")
private String orgCategory;
@Excel(name="职级",width=15,dictTable = "sys_position", dicCode = "id", dicText = "name")
private String positionId;
}
三、Excel数据导出与模板定制
3.1 基础导出功能
JeecgBoot提供两种导出模式:简单导出(直接使用@Excel注解)和模板导出(基于Freemarker模板)。最简单的导出实现只需在控制器中添加:
@GetMapping("/exportXls")
public ModelAndView exportXls(HttpServletRequest request, SysUser sysUser) {
return super.exportXls(request, sysUser, SysUser.class, "用户列表");
}
3.2 高级模板定制
对于复杂格式的Excel报表,可使用Freemarker模板引擎定制导出样式。系统提供模板处理工具类:
public class SysBaseApiImpl implements SysBaseApi {
@Override
public String getHtmlByTemplate(String templatePath, Map<String, Object> params) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassLoaderForTemplateLoading(Thread.currentThread().getContextClassLoader(), "templates");
cfg.setDefaultEncoding("UTF-8");
Template template = cfg.getTemplate(templatePath);
return FreeMarkerTemplateUtils.processTemplateIntoString(template, params);
}
}
3.3 导出模板示例
定制化Excel模板可包含复杂表头、数据区域、统计计算等元素,满足企业级报表需求:
<!-- 部门统计报表模板片段 -->
<#list departList as depart>
<tr>
<td>${depart.index + 1}</td>
<td>${depart.departName}</td>
<td>${depart.userCount}</td>
<td>${depart.leaderName}</td>
<td>${depart.createTime?string("yyyy-MM-dd")}</td>
</tr>
</#list>
<tr>
<td colspan="2">总计</td>
<td>${totalCount}</td>
<td colspan="2"></td>
</tr>
四、常见问题与解决方案
4.1 大数据量导入优化
当导入数据量超过1万条时,建议采用分批处理策略,避免内存溢出:
// 大数据量分批导入
public Result<?> importBigData(MultipartFile file) {
ImportParams params = new ImportParams();
params.setHeadRows(1);
params.setBatchSize(1000); // 每批处理1000条
ExcelImportUtil.importExcelBySax(file.getInputStream(),
SysUserImportVo.class, params, new IReadHandler<SysUserImportVo>() {
private List<SysUserImportVo> batchList = new ArrayList<>(1000);
@Override
public void handler(SysUserImportVo user) {
batchList.add(user);
if (batchList.size() >= 1000) {
userService.saveBatch(batchList);
batchList.clear();
}
}
@Override
public void doAfterAll() {
if (!batchList.isEmpty()) {
userService.saveBatch(batchList);
}
}
});
return Result.ok("导入成功");
}
4.2 导入错误处理机制
框架提供完善的错误处理机制,可收集导入过程中的错误信息并返回给用户:
// 错误收集示例
List<ExcelVerifyInfo> verifyList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
SysUserImportVo user = list.get(i);
if (StringUtils.isEmpty(user.getUsername())) {
verifyList.add(new ExcelVerifyInfo(i+1, "登录账号", "用户名不能为空"));
}
}
if (!verifyList.isEmpty()) {
return Result.error("导入失败").put("verifyList", verifyList);
}
前端可根据错误信息生成详细的错误报告,方便用户修正数据后重新导入。
五、总结与进阶学习
JeecgBoot通过注解驱动和工具类封装,大幅降低了Excel数据处理的复杂度,使开发者能够专注于业务逻辑实现。核心优势包括:
- 零代码快速集成导入导出功能
- 灵活的模板定制满足复杂报表需求
- 完善的数据校验与错误处理机制
- 高性能设计支持大数据量处理
进阶学习建议:
- 深入研究
@Excel注解的高级属性配置 - 学习自定义数据转换器实现复杂类型转换
- 掌握模板引擎实现动态报表生成
收藏本文,关注JeecgBoot官方文档,获取更多企业级开发技巧!下期我们将带来"JeecgBoot报表设计与可视化实战",敬请期待。
官方文档:README.md 示例代码:jeecg-boot-module-demo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



