easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
码云源码地址
官方文档(说实话这官方文档我觉得挺EMMM的,看到我后面的Excel上传数据至数据库你就知道了)
下面上demo
代码已上传至码云
先准备一个整合好了持久层框架的SpringBoot项目,怎么弄就不赘述了。
不过需要注意的是easypoi是在实体类的属性上加注解来与excel的格式做出映射关系。这里给出数据库的建表sql和数据及实体类代码。
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`create_time` datetime(0) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (1, 'zhangsan', '1', '2020-07-22 10:08:59');
INSERT INTO `user` VALUES (2, '李四', '0', '2020-07-22 10:09:00');
INSERT INTO `user` VALUES (3, '王五', '1', '2020-07-22 10:08:59');
INSERT INTO `user` VALUES (4, '赵四', '0', '2020-07-22 10:09:00');
实体类User
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键ID
*/
private Long id;
/**
* 姓名
*/
@Excel(name = "姓名", height = 20, width = 30, isImportField = "true")
private String name;
/**
* 性别
*/
@Excel(name = "性别", replace = { "男_1", "女_0" }, suffix = "生", isImportField = "true")
private Integer sex;
/**
* 创建时间
*/
@Excel(name = "创建时间", databaseFormat = "yyyy-MM-dd HH:mm:ss", format = "yyyy-MM-dd HH:mm:ss", isImportField = "true", width = 40)
private Date createTime;
}
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
这三个注解是lombok的就不多做解释了
@Excel是easypoi的注解,大概的作用就是将excel中的列和实体类的属性关联起来,可以理解为做了一个映射,这样easypoi就可以将每一行的数据根据这个映射关系转换成一个个实体对象。
此外该注解还有许多属性,常用的比如name表示对应excel文件中表头的列,databaseFormat可以控制时间输出格式,replace可对指定值进行替换。详见注解文档
导出
到这里基本上准备工作就做好了,我们来做导出。
大致的流程就是我们先将数据从数据库中查出来,获得一个List。通过easypoi提供的工具类生成一个excel文件并将这个List通过固定的格式放进去。最后将这个excel文件通过response的输出流传送给客户,实现下载。
controller层代码
@RequestMapping("exportExcel")
public void exportExcel(HttpServletResponse response){
userService.exportExcel(response);
}
service层代码
@Override
public void exportExcel(HttpServletResponse response) {
//获取数据库数据
List<User> userList = userDao.selectList(null);
userList.forEach(user->System.out.println(user));
//生成Excel文件
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","用户列表"),
User.class, userList);
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
//通过输出流输出文件
try {
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("用户", "UTF-8") + ".xls");
ServletOutputStream out = response.getOutputStream();
workbook.write(out);
out.flush();
out.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
导入
到这里导出基本上就做好了,当时写到这里还有点小激动,又多学会了一点,嘿嘿。
然后我满怀激动的去看官方文档准备做个基础的导入,嗯。。。官网给我的提示是这样的
我当时是懵的,然后我开始冥思苦想各种查资料怎么做导入。最后我突然看到导出中调用的工具类名ExcelExportUtil,根据我们常用的代码规范。有InputStream就有OutputStream,那么有ExcelExportUtil是不是也有ExcelImportUtil呢。于是我真找到了
应该就是这个importExcel方法了,根据提示的参数类型。第一个参数应该是上传过来的excel文件或者输入流,第二个参数就是对应的实体类类型,第三个应该是一些固定的参数,我们直接new一个默认的先试试好了。
反正最后我是成功了,下面上代码
controller层代码
@RequestMapping("importExcel")
public void importExcel(@RequestParam("file") MultipartFile file){
userService.importExcel(file);
}
service层代码
@Override
public void importExcel(MultipartFile file) {
List<User> userList = null;
//将excel文件中的数据放入List中
try {
userList = ExcelImportUtil.importExcel(file.getInputStream(), User.class,new ImportParams());
} catch (Exception e) {
e.printStackTrace();
}
//将数据放入数据库
userList.forEach(user->System.out.println(user));
userDao.insertList(userList);
}
上传excel的格式是下面这样的
最后给个简陋的前端测试页面
位于static文件夹下的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传excl</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
</head>
<body>
<div class="panel panel-primary">
<!-- .panel-heading 面板头信息。 -->
<div class="panel-heading">
<!-- .panel-title 面板标题。 -->
<h1 class="panel-title">上传excl并插入到数据库</h1>
</div>
</div>
<form class="form-horizontal" action="/importExcel" enctype="multipart/form-data" method="post">
<div class="form-group">
<div class="input-group col-md-4">
<span class="input-group-addon">
<i class="glyphicon glyphicon-search"></i>
</span>
<input class="form-control" placeholder="请选择文件" type="file" name="file"/>
</div>
</div>
<div class="form-group">
<div class="col-md-4">
<div class="btn-group btn-group-justified" >
<div class="btn-group" >
<button type="submit" class="btn btn-success" id="submitbtn">
<span class="glyphicon glyphicon-share"></span> excel上传</button>
</div>
</div>
</div>
</div>
</form>
<table border="0" style="margin-top:4px; margin-left: 18px">
<tr>
<td><a href="#" class="easyui-linkbutton" onclick="downloadfile1();">excel导出</a></td>
</tr>
</table>
<script>
function downloadfile1(){
window.location.href="/exportExcel";
}
</script>
</body>
</html>