java编程中通过easypoi导入excel文件并验证导入数据
引言
现如今越来越多的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模块。
项目结构图
三.编码
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的验证框架。
对easypoi的验证机制就是引入了hibernate的验证框架。所以使用也是相同的。
3.3编写一个handler
easypoi 的handler是用来处理一些特殊事情的。比如导入的数据某些信息不能与现有数据库中的数据冲突,那么必然会查询数据库。这样的处理是上面hibernate验证框架也无法轻易实现的。所以他这里设计了一个handler。
下面是一个简单的hander,只做了打印出导入数据的信息:
package net.xqlee.project.demo.handler;
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHanlderResult;
import cn.afterturn.easypoi.handler.inter.IExcelDataHandler;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
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 implements IExcelVerifyHandler<User> {
private static final Logger log = LoggerFactory.getLogger(UserExcelHandler.class);
/***
* 自定义验证实现
* @param user
* @return
*/
@Override
public ExcelVerifyHanlderResult verifyHandler(User user) {
ExcelVerifyHanlderResult result=new ExcelVerifyHanlderResult(true);//默认设置验证通过为true
//TODO================可以根据对象字段进行各种验证=================
//例如:(注意正则验证在字段注解无效,也可以通过该方式来验证)
if (user.getAge()<0){
result.setSuccess(false);//错误标记,该数据会放在导入的返回集合 getFailList()中
result.setMsg("年纪错误");
return result;
}
return result;
}
}
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();
// 数据处理
UserExcelHandler handler = new UserExcelHandler();
importParams.setVerifyHanlder(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文件内容如下:
4.2启动项目并测试
首先启动项目,我这里是spring boot项目直接运行主类就启动了:
由于我在demo中并没有编写页面只是写了一个接口,所以这里测试用了工具postman
提示:工具下载,访问密码 9987
Postman官方版.exe
在postmain中输入接口的地址并选择提交方式。将上传的文件以form-data的方式设置,具体如下图:
重点的已经在图中圈出来了。
点击postman的SEND按钮发起请求。观察eclipse控制台的日志输出:
可以看到,导入时候handler已经执行。(需注意的是handler的字段名是excel的代码中已经注明)
验证结果和我们预想的一样。
因年龄大于20,中文名各自失败一个。
成功一条。
好啦到这里通spring boot项目通过easypoi导入excel文件数据的例子就讲解完毕了。如果有疑问欢迎留言讨论
提示:项目源码下载
首选下载:demo-springboot-easypoi-excel.zip 访问密码9987