`
thinkgem
  • 浏览: 585955 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

介绍:

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

 

 

 

 

分享到:
评论
8 楼 18813188509 2018-06-19  
请教,怎么在标题或者表头的前面显示导出报表的时间、数据数量…………
或者在数据结尾显示导出报表的时间、数据数量……
7 楼 hs117 2016-10-25  
只能导出30条数据,请问怎么解决?
6 楼 buyinggaiba 2015-08-29  
您好,如果导出的是一个实体的多个列应该怎么写注解
5 楼 thinkgem 2015-08-20  
wlsessionlucky 写道
怎么导出两列值但只显示到一列上 如:姓名(电话)---是显示到一列

自己写一个get方法,加上@ExcelField注解,返回两个值的数据。
4 楼 wlsessionlucky 2015-08-12  
怎么导出两列值但只显示到一列上 如:姓名(电话)---是显示到一列
3 楼 softchi 2015-04-28  
您好 我在自己的项目中用到了您这个导出功能,但是现在遇到一个问题,您现在实现的是当前对象,如何实行类对象的属性
如:public class Xsjbxx{private UserExt uu;}
public class Xsjbxx{
   private Integer id ;
   private String name;
   private String sex;
}

就是导入、导出Xsjbxx中id,name,sex
2 楼 thinkgem 2014-07-16  
zhangabcdjie 写道
您好 我在自己的项目中用到了您这个导出功能,但是现在遇到一个问题,您现在实现的是单表数据导出,如果想实现多个数据库表导出呢....该怎么办....本人菜鸟一个......

这个导出导入功能和数据库无关,这里只是读取和写入excel文件
1 楼 zhangabcdjie 2014-06-29  
您好 我在自己的项目中用到了您这个导出功能,但是现在遇到一个问题,您现在实现的是单表数据导出,如果想实现多个数据库表导出呢....该怎么办....本人菜鸟一个......

相关推荐

    easypoi导入导出excel表格.pdf

    在Java开发中,对于数据的导入导出,尤其是Excel表格,是一种非常常见的需求。而easypoi为我们提供了简洁的方式来实现这一功能。 ### eapoi导出导入概述 easypoi是一个基于Apache POI的简单易用的Java Excel操作...

    easy-poi导入导出excel实例

    《使用Easy-Poi进行Excel导入导出的实践详解》 在现代企业中,数据处理是一项不可或缺的任务,而Excel作为常见的数据存储和分析工具,其导入导出功能在各种业务场景中发挥着重要作用。Easy-Poi是一款优秀的Java库,...

    Excel导入导出,Java注解的方式实现

    在Java编程领域,Excel的导入导出是一项常见的需求,特别是在数据处理、报表生成以及数据分析等场景。本篇文章将深入探讨如何使用Java注解的方式实现Excel的导入导出功能。 首先,我们要理解Java注解(Annotation)...

    SpringMvc 使用poi导入导出Excel

    在实际业务场景中,我们经常需要处理Excel数据的导入和导出,这在数据分析、报表生成等方面非常常见。本篇文章将详细介绍如何在Spring MVC项目中使用Apache POI库来实现Excel的导入和导出。 Apache POI是Apache软件...

    springboot 实现后端接口操作Excel的导出、批量导入功能

    在本文中,我们将深入探讨如何使用SpringBoot框架来实现后端接口,以便处理Excel文件的导出和批量导入功能。SpringBoot以其简化Spring应用开发的特性,成为了Java开发者广泛采用的工具。它允许我们快速构建可运行的...

    spring的annotation-driven配置事务管理器详解 (多数据源配置

    Spring 的 Annotation-Driven 配置事务管理器详解(多数据源配置) Spring 框架提供了强大的事务管理机制,通过使用 Annotation-Driven 配置,可以方便地管理事务。在多数据源配置中,spring 的 Annotation-Driven...

    springboot整合easypoi实现文件导入导出OSS文件上传和下载。OSS图片导出

    Easypoi是一个强大的Java操作Excel的工具,支持Excel的读写,特别适用于处理大量数据的导入导出。下面我们将详细阐述这一过程。 首先,我们需要在SpringBoot项目中引入Easypoi的相关依赖。Easypoi提供了注解方式来...

    easyPOI表格导入导出所需jar包

    在Java开发中,数据的导入导出经常涉及到各种表格格式,如Excel,这在数据分析、报表生成、数据交换等场景中十分常见。EasyPOI是一个优秀的开源库,它简化了Java与Excel之间的交互,提供了方便快捷的表格导入导出...

    基于注解导出excel

    在Java编程中,导出Excel是一项常见的需求,特别是在数据分析、报表生成或数据交换等场景下。基于注解的导出方式可以提供更加简洁、灵活的代码实现,减少重复工作,并提高代码可读性。本篇将详细介绍如何使用注解与...

    Excel 导入 数据 spring boot

    使用POI库中的`XSSFWorkbook`和`SXSSFWorkbook`(适用于大数据量导入,内存占用较小)来读取Excel文件。以下是一个简单的示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf....

    poi导入导出及spring

    ### POI导入导出及Spring框架综合应用 #### 一、Apache POI简介与核心功能 Apache POI是Apache软件基金会的Jakarta项目中的一个子项目,它为Java程序员提供了一组API,使得他们能够使用Java来操作Microsoft Office...

    java导入导出功能使用poi5

    在Java编程中,Apache POI库是一个非常流行的用于...以上就是使用Apache POI 5.0在Java中实现Excel导入导出功能的基本步骤。在实际应用中,还需要考虑错误处理、数据验证、格式化等细节,确保代码的健壮性和用户体验。

    注解反射导出Excel自定义中文表头

    本文将深入探讨如何使用注解反射技术来实现Excel自定义中文表头的导出,结合数据库查询的数据,以实现更加灵活和人性化的数据展示。 首先,让我们了解什么是注解(Annotation)。注解是Java提供的一种元数据,它...

    struts2 使用Annotation 配置的小例子

    在"struts2 使用Annotation 配置的小例子"中,我们可能会看到以下几个核心的Annotation: 1. `@Action`: 这个Annotation用于标记一个方法作为Struts2的动作。你可以指定该动作的名称、结果类型、以及它将执行的类。...

    使用POI数据导出到Excel

    标签中的"POI Excel 数据导出"指明了主要的技术点,即使用POI库处理Excel文件进行数据的导入和导出。在这个过程中,你可能需要了解如何设置单元格样式、合并单元格、插入图表、处理日期和数字格式等高级特性。 在...

    Spring的Annotation配置相关讲义

    首先,启用Spring的Annotation配置需要在`beans.xml`配置文件中添加特定的命名空间和元数据。以下是启用Annotation配置的关键步骤: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p=...

    springboot-excel.zip

    以上就是一个基于SpringBoot、Maven、Apache POI以及自定义注解和反射实现Excel导入导出的简单示例。通过这种方式,我们可以灵活地控制Excel数据的处理,同时降低了代码的耦合度,提高了可维护性。在实际项目中,你...

    基于Annotation的Servlet配置

    这篇博文"基于Annotation的Servlet配置"探讨了如何使用注解来配置Servlet,让我们深入理解这一现代Web应用开发中的重要概念。 首先,我们来看`@WebServlet`注解。这个注解是Java Servlet API的一部分,可以直接在...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

Global site tag (gtag.js) - Google Analytics