介绍:
对Apache POI 3.9的简单封装,实现Excel的导出导入功能。使用Annotation定义导出导入字段。
优点:
- 简单易用,支持大数量导出,配置简单,代码量少。
- 支持Excel 2003、2007、2010(xls、xlsx)格式。
- 支持简单格式设置,对齐方式,排序等
- 可导出字典类型数据,自定义数据字段类型(例如:部门关联对象,部门名称与部门编号互转)。
- 无需建立导入模板,系统自动生成。
缺点:
- 格式单一,无法导出格式比较复杂的表格。
- 不能使用模板进行导入,导出。
使用示例:
1、导出实体对象中的annotation的定义(ExcelField说明见:5、ExcelField定义说明):
- @Table(name = "sys_user")
- public class User extends BaseEntity {
- private Long id; // 编号
- ...
- ...
- ...
- private List<Role> roleList = Lists.newArrayList(); // 拥有角色列表
- @ExcelField(title="ID", type=1, align=2, sort=1)
- public Long getId() {
- return id;
- }
- @ManyToOne
- @ExcelField(title="所属区域", align=2, sort=10)
- public Area getArea() {
- return area;
- }
- @ManyToOne
- @ExcelField(title="所属部门", align=2, sort=20)
- public Office getOffice() {
- return office;
- }
- @Length(min=1, max=100)
- @ExcelField(title="姓名", align=2, sort=40)
- public String getName() {
- return name;
- }
- @Length(min=0, max=100)
- @ExcelField(title="用户类型", align=2, sort=80, dictType="sys_user_type")
- public String getUserType() {
- return userType;
- }
- @ExcelField(title="创建时间", type=0, align=1, sort=90)
- public Date getCreateDate() {
- return createDate;
- }
- @ExcelField(title="最后登录日期", type=1, align=1, sort=110)
- public Date getLoginDate() {
- return loginDate;
- }
- @ManyToMany
- @ExcelField(title="拥有角色", align=1, sort=800, fieldType=RoleListType.class)
- public List<Role> getRoleList() {
- return roleList;
- }
- }
2、Excel导出示例:
- public String exportFile(User user) {
- try {
- String fileName = "用户数据"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
- // 查询数据
- Page<User> page = systemService.findUser(new Page<User>(request, response, -1), user);
- // 1:创建Excel导出对象;2:设置数据;3:写入输出流;4:临时数据销毁
- new ExportExcel("用户数据", User.class)
- .setDataList(page.getList())
- .write(response, fileName)
- .dispose();
- return null;
- } catch (Exception e) {
- addFlashMessage("导出用户失败!失败信息:"+e.getMessage());
- }
- return "redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";
- }
3、Excel 导入示例:
- public String importFile(MultipartFile file) {
- try {
- int successNum = 0;
- int failureNum = 0;
- StringBuilder failureMsg = new StringBuilder();
- // 创建导入Excel对象
- ImportExcel ei = new ImportExcel(file, 1, 0);
- // 获取传入Excel文件的数据,根据传入参数类型,自动转换为对象
- List<User> list = ei.getDataList(User.class);
- // 遍历数据,保存数据
- for (User user : list){
- try{
- if ("true".equals(checkLoginName("", user.getLoginName()))){
- user.setPassword(SystemService.entryptPassword("123456"));
- BeanValidators.validateWithException(validator, user);
- systemService.saveUser(user);
- successNum++;
- }else{
- failureMsg.append("<br/>登录名 "+user.getLoginName()+" 已存在; ");
- failureNum++;
- }
- }catch(ConstraintViolationException ex){
- failureMsg.append("<br/>登录名 "+user.getLoginName()+" 导入失败:");
- List<String> messageList = BeanValidators.extractPropertyAndMessageAsList(ex, ": ");
- for (String message : messageList){
- failureMsg.append(message+"; ");
- failureNum++;
- }
- }catch (Exception ex) {
- failureMsg.append("<br/>登录名 "+user.getLoginName()+" 导入失败:"+ex.getMessage());
- }
- }
- if (failureNum>0){
- failureMsg.insert(0, ",失败 "+failureNum+" 条用户,导入信息如下:");
- }
- addFlashMessage("已成功导入 "+successNum+" 条用户"+failureMsg);
- } catch (Exception e) {
- addFlashMessage("导入用户失败!失败信息:"+e.getMessage());
- }
- return "redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";
- }
4、Excel 导入模板下载示例
- public String importFileTemplate() {
- try {
- String fileName = "用户数据导入模板.xlsx";
- List<User> list = Lists.newArrayList(); list.add(UserUtils.getUser(true));
- // 第三个参数设置为“2”表示输出为导入模板(1:导出数据;2:导入模板)
- new ExportExcel("用户数据", User.class, 2).setDataList(list).write(response, fileName).dispose();
- return null;
- } catch (Exception e) {
- addFlashMessage("导出用户失败!失败信息:"+e.getMessage());
- }
- return "redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";
- }
5、ExcelField定义说明:
- /**
- * Copyright © 2012-2013 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- */
- package com.thinkgem.jeesite.common.utils.excel.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * Excel注解定义
- * @author ThinkGem
- * @version 2013-03-10
- */
- @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- public @interface ExcelField {
- /**
- * 导出字段名(默认调用当前字段的“get”方法,如指定导出字段为对象,请填写“对象名.对象属性”,例:“area.name”、“office.name”)
- */
- String value() default "";
- /**
- * 导出字段标题
- */
- String title();
- /**
- * 字段类型(0:导出导入;1:仅导出;2:仅导入)
- */
- int type() default 0;
- /**
- * 导出字段对齐方式(0:自动;1:靠左;2:居中;3:靠右)
- */
- int align() default 0;
- /**
- * 导出字段字段排序(升序)
- */
- int sort() default 0;
- /**
- * 如果是字典类型,请设置字典的type值
- */
- String dictType() default "";
- /**
- * 反射类型
- */
- Class<?> fieldType() default Class.class;
- }