文档章节

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

ThinkGem
 ThinkGem
发布于 2016/07/17 16:50
字数 960
阅读 207
收藏 1

介绍:

对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;
	
}
 

 

 

 

 

本文转载自:http://thinkgem.iteye.com/blog/1833431

共有 人打赏支持
ThinkGem

ThinkGem

粉丝 916
博文 136
码字总数 21994
作品 1
济南
架构师
jeesite 快速开发平台 初体验

http://www.jeesite.com/ GitHub:https://github.com/thinkgem/jeesite 开源中国:http://git.oschina.net/thinkgem/jeesite 更多文档 https://github.com/thinkgem/jeesite/tree/master/do......

晨猫
05/21
0
0
JeeSite环境搭建及运行和打包(master20161117)

涉及的软件: 1、phpStudy(主要用MySql) 2、maven3(用于依赖包,下面我将上传已经下载好所有依赖包的版本,保证运行正常) 具体操作: 0、前言 由于GitHub上的Release版本没有及时更新,所...

easonjim
2016/11/18
0
0
ThinkGem/JeeSite 4.0 JFlow工作流引擎-表单引擎

项目介绍 jeesite4-jflow jeesite4-JFlow 是jeesite集成JFlow的版本. 您即可以使用jeesite的敏捷性开发,也可以使用JFlow的流程引擎,表单引擎的功能. 我们已经把jeesite与jflow的组织结构集...

ThinkGem
08/15
0
0
JeeSite 4.0.3 发布,企业级快速开发平台

新增 新增:core项目增加单元测试支持类 ApplicationTest.java 新增:代码生成config.xml支持自定义,放同目录下config-custom.xml文件即可覆盖 新增:shiro.allowRequestMethods 参数,可指...

ThinkGem
05/30
0
0
JeeSite4.0,一直报这个问题,求解释

DEBUG [com.jeesite.common.io.PropertiesUtils] - Loading jeesite config: [classpath:/config/jeesite-core.yml, classpath:config/jeesite.yml, classpath:config/application.yml, clas......

陈豫
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nginx模块学习六 add_header 跨域访问

语法 Syntax: add_header name value [always];Default: --Context:http,server,location,if in location 例:/etc/nginx/conf.d/default.conf server {    listen       80; ......

Romanceling
今天
0
0
SpringBoot初探

#SpringBoot初探 三种创建SpringBoot项目的方式: 第一种:使用IDEA创建maven项目,选择maven-archetype-quickstart; 第二种:使用IDEA创建Spring Initializer,选择web组件; 第三种:使用...

向码而生
今天
2
0
IO

JAVA中IO技术:BIO、NIO、AIO 1、同步异步、阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方...

DemonsI
今天
0
0
org.apache.commons 常用工具类

一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不抛出异常。通常放在finally块。 toString 转换IO流、 Uri、 byte[]为String。 copy IO流数据复制,...

sprouting
今天
0
0
linux使用Inotify监控目录或者文件状态变更

基本概念: Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 需求: 1.有一个文件采集进程,...

mickelfeng
今天
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部