引言

    现如今越来越多的web网站或者内部管理web系统都有自己的数据分析中心。其数据中心的数据有些来源于人工单独操作,某些来自人工搜集大量的信息后通过excel文件批量导入进系统。本博客将讲解在java编程中,通过excel文件导入数据的方法,其实现是通过国人基于Apache晦涩难懂的POI编写的easypoi框架。

一.准备

  • jdk 1.8+(由于本博客使用的spring boot框架所以jdk版本偏高,普通项目1.6即可);
  • eclipse(由于创建的spring boot项目,eclipse中已经安装spring的插件STS)或者你自己喜欢的java IDE工具
  • maven 3+

二.创建java web项目(spring boot框架的web项目)

本人偏好使用spring boot来创建web项目。下面通过eclipse的STS创建一个spring boot项目并选择了web模块。
项目结构图spring boot web项目结构图

三.编码

3.1添加easypoi的依赖

创建好一个基于maven的项目以后都会有个pom.xml的配置文件.打开该配置文件找到dependencies节点.添加以下easypoi的依赖配置
<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-web -->
<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-web</artifactId>
	<version>3.0.3</version>
</dependency>
我的spring boot添加好依赖以后完整的pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>net.xqlee.project.demo</groupId>
	<artifactId>demo-springboot-easypoi-excel</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo-springboot-easypoi-excel</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-web -->
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-web</artifactId>
			<version>3.0.3</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

3.2编写一个简单的POJO对象

编写一个劲简单的POJO对象用来做导入测试
package net.xqlee.project.demo.pojo;

import java.util.Date;

import javax.validation.constraints.Max;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.NotBlank;

import cn.afterturn.easypoi.excel.annotation.Excel;

public class User {
	@Excel(name = "id")
	@NotBlank(message = "该字段不能为空")
	private String id;

	@Excel(name = "姓名")
	@Pattern(regexp = "[\\u4E00-\\u9FA5]{2,5}", message = "姓名中文2-5位")
	private String name;

	@Max(value=20)
	@Excel(name = "年龄")
	private Integer age;

	@Excel(name = "生日", importFormat = "yyyy-MM-dd")
	private Date birthday;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

}
或许你已经发现,在创建的pojo的属性上我添加了一些注解。其中excel的注解是用于与excel文件做映射使用的。另外的一部分是验证使用。通过上面的依赖导入我们可以看项目的maven实际导入的包中含有hibernate的验证框架。
hibernate验证框架
对easypoi的验证机制就是引入了hibernate的验证框架。所以使用也是相同的。

3.3编写一个handler

    easypoi 的handler是用来处理一些特殊事情的。比如导入的数据某些信息不能与现有数据库中的数据冲突,那么必然会查询数据库。这样的处理是上面hibernate验证框架也无法轻易实现的。所以他这里设计了一个handler。

下面是一个简单的hander,只做了打印出导入数据的信息:
package net.xqlee.project.demo.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl;
import net.xqlee.project.demo.pojo.User;

public class UserExcelHandler extends ExcelDataHandlerDefaultImpl<User> {
	
	private static final Logger log = LoggerFactory.getLogger(UserExcelHandler.class);

	
	@Override
	public Object importHandler(User obj, String name, Object value) {
		log.info(name+":"+value);
		return super.importHandler(obj, name, value);
	}

}

3.4编写controller

package net.xqlee.project.demo.controller;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.handler.inter.IExcelDataHandler;
import net.xqlee.project.demo.handler.UserExcelHandler;
import net.xqlee.project.demo.pojo.User;

@RestController
public class ExcelImportController {

	private static final Logger log = LoggerFactory.getLogger(ExcelImportController.class);

	@PostMapping("excelImport.do")
	public void excelImport(@RequestParam("file") MultipartFile file) {
		ImportParams importParams = new ImportParams();
		// 数据处理
		IExcelDataHandler<User> handler = new UserExcelHandler();
		handler.setNeedHandlerFields(new String[] { "姓名" });// 注意这里对应的是excel的列名。也就是对象上指定的列名。
		importParams.setDataHanlder(handler);

		// 需要验证
		importParams.setNeedVerfiy(true);

		try {
			ExcelImportResult<User> result = ExcelImportUtil.importExcelMore(file.getInputStream(), User.class,
					importParams);

			List<User> successList = result.getList();
			List<User> failList = result.getFailList();

			log.info("是否存在验证未通过的数据:" + result.isVerfiyFail());
			log.info("验证通过的数量:" + successList.size());
			log.info("验证未通过的数量:" + failList.size());

			for (User user : successList) {
				log.info("成功列表信息:ID=" + user.getId() + user.getName() + "-"
						+ new SimpleDateFormat("yyyy-MM-dd").format(user.getBirthday()));
			}
			for (User user : failList) {
				log.info("失败列表信息:" + user.getName());
			}
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}
}

这里就详细的使用了easypoi导入excel的代码;主要的是首先创建一个导入的参数,参数中可以设置handler还有是否验证等。然后通过easypoi的一个静态工具类调用导入。

四.演示

4.1创建一个用于测试的excel文件

我这创建的excel文件内容如下:easypoi测试数据

4.2启动项目并测试

首先启动项目,我这里是spring boot项目直接运行主类就启动了:
spring boot启动日志
由于我在demo中并没有编写页面只是写了一个接口,所以这里测试用了工具postman,大家可以百度。
在postmain中输入接口的地址并选择提交方式。将上传的文件以form-data的方式设置,具体如下图:
postmain测试数据设置
重点的已经在图中圈出来了。

点击postman的SEND按钮发起请求。观察eclipse控制台的日志输出:
easypoi导入日志可以看到,导入时候handler已经执行。(需注意的是handler的字段名是excel的代码中已经注明)
验证结果和我们预想的一样。
因年龄大于20,中文名各自失败一个。
成功一条。

好啦到这里通spring boot项目通过easypoi导入excel文件数据的例子就讲解完毕了。如果有疑问欢迎加入QQ群讨论

项目源码下载
暂无评论