JeeSite的Excel导入、导出、支持大数据量,使用annotation最小化配置

2016/07/17 16:50
阅读数 1.8K

介绍:

对Apache POI 3.9的简单封装,实现Excel的导出导入功能。使用Annotation定义导出导入字段。http://jeesite.com

优点:

  1. 简单易用,支持大数量导出,配置简单,代码量少。
  2. 支持Excel 2003、2007、2010(xls、xlsx)格式。
  3. 支持简单格式设置,对齐方式,排序等
  4. 可导出字典类型数据,自定义数据字段类型(例如:部门关联对象,部门名称与部门编号互转)。
  5. 无需建立导入模板,系统自动生成。

缺点:

  1. 格式单一,无法导出格式比较复杂的表格。
  2. 不能使用模板进行导入,导出。

使用示例:

 

1、导出实体对象中的annotation的定义(ExcelField说明见:5、ExcelField定义说明):

  

@Entity
@Table(name = "sys_user")
public class User extends BaseEntity {

	private Long id;		// 编号
	...
	...
	...	
	private List<Role> roleList = Lists.newArrayList(); // 拥有角色列表
	
	@Id
	@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 &copy; 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;
	
}
 

 

 

 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部