![a40922b1b6b3d5ff972b87b0a96fe7d4.png](https://img-blog.csdnimg.cn/img_convert/a40922b1b6b3d5ff972b87b0a96fe7d4.png)
业务需求:上文已经实现了产品信息Excel的导出,接下来将用POI实现Excel导入。
需求分析:导入其实是导出的逆过程,数据格式是一样的,均为矩阵式(二维)的数据格式,下面将以导出的模板作为Excel导入时数据填充的文件!
实现思路:
![1ba997fe62a205c7886aca398fc4fa01.png](https://img-blog.csdnimg.cn/img_convert/1ba997fe62a205c7886aca398fc4fa01.png)
同样的道理,有了上面的思路,接下来即开始代码的实战了。
1、在实战之前,介绍一下项目使用的“状态码”枚举类StatusCode,“自定义Excel版本”枚举类WorkBookVersion以及“通用响应类”BaseResponse如下所示:
![8a17a68e29733fb313041b7efe5635dd.png](https://img-blog.csdnimg.cn/img_convert/8a17a68e29733fb313041b7efe5635dd.png)
![7cf1e9ecc0f758c247a9c01fed824721.png](https://img-blog.csdnimg.cn/img_convert/7cf1e9ecc0f758c247a9c01fed824721.png)
![f22825edc41f74e200debe2937caef97.png](https://img-blog.csdnimg.cn/img_convert/f22825edc41f74e200debe2937caef97.png)
2、接着,在ProductController开发导入Excel的功能,其中,我在这里采用的是同步提交表单的方式(因为涉及到同步上传文件),并用MultipartHttpServletRequest充当request(目的真是为了直接获取MultipartFile属性并进行后续的文件操作-在这里顺带说一下,springmvc所有涉及到文件上传的均可以采用此请求对象同步接收前端参数)。
![e1c61f737624882527f749528e4cb465.png](https://img-blog.csdnimg.cn/img_convert/e1c61f737624882527f749528e4cb465.png)
3、正如上图所展示的,前面部分用于获取相关请求参数,中间才是“导入”的核心重点,即创建Workbook实例(根据后缀名选择不同的Workbook子类),如图:
![e9a58d3fd8a3665138de4da3ca58747f.png](https://img-blog.csdnimg.cn/img_convert/e9a58d3fd8a3665138de4da3ca58747f.png)
接着则是封装一个Poi服务类,用于读取上传上来的Excel的内容,其思路其实就是本文最先开始的“实现思路”,即:
![1ba997fe62a205c7886aca398fc4fa01.png](https://img-blog.csdnimg.cn/img_convert/1ba997fe62a205c7886aca398fc4fa01.png)
而其实现思路如下:
![16b63e1a3c6e9ee1e9ed736dab6cb389.png](https://img-blog.csdnimg.cn/img_convert/16b63e1a3c6e9ee1e9ed736dab6cb389.png)
在这里我封装了一个统一处理从Excel读取出来的Cell(单元格)的内容。
![8823e74267e0fe96cae44b1883238d12.png](https://img-blog.csdnimg.cn/img_convert/8823e74267e0fe96cae44b1883238d12.png)
4、将上面读取的到List,插入到数据库表中(采用批量插入或者一行一行插入其实都是可以的,“批量插入的Sql在数据库底层其实是一行一行执行的”)
5最后,可以看一下效果:
![e78d8106369d3d215786ffd3d77f2e42.png](https://img-blog.csdnimg.cn/img_convert/e78d8106369d3d215786ffd3d77f2e42.png)
![6b232888d410cb9b71d3f6e451f3a03e.png](https://img-blog.csdnimg.cn/img_convert/6b232888d410cb9b71d3f6e451f3a03e.png)
6、感悟:在导入Excel过程中,需要读取Excel每一行每一列的数据,而在读取到每个row每个column时,会发现excel中预先设定好的header其实就是某个entity类的字段属性,而每个row的具体取值其实就是该类每个对象实例。众多的row即List构成了整个sheet,乃至整个Excel。
推荐阅读:
1、SSM实战第一篇_SSM的整合
2、SSM实战第二篇_POI导出Excel