easy poi 实现Excel文件的导入导出(SpringBoot整合)

tech2026-02-22  1

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>&nbsp;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>
最新回复(0)