POI导入导出【面试+工作】

POI导入导出【面试+工作】

1.场景一

近期项目中的excel导入导出功能需求频繁的出现,趁此机会,今天笔者对POI的Excel数据的导入导出做一番详解,希望对大家有所帮助。

2.准备工作

①添加POI依赖

以及excel Jar包依赖

②自定义一个字段与属性名的excel注解

3.Excel导出

代码如下:

剖析详解:

①根据前端属性个数新建excel行数

②根据前端具体表格进行属性名赋值

③根据对应的属性名赋对应的值,对号入座

④导出并下载

效果图:

4.Excel导入

待导入excel文件如图:

①根据待导入的Excel自定义相应的实体,以Person为例

其中引用了Excel的自定义注解,将excel中文的字段对应数据库的属性;注意:这里的所有属性最好都定义为String类型,要不然后期的导入效果会不尽人意的。

②PersonMapper

这里的字段类型可以不写,如果执意要写一定要跟数据库类型保持一致,有人可能会问,你刚才的Person属性都定义为String,这里又要跟数据库保持一致,不冲突么?放心,我清楚的告诉你,就该这么玩!

③数据库Person的id设备自增

④excel导入方法

⑤好了,直接看controller

当然,path肯定是前端传过来的参数,这里为了方便测试才写死的!一般地,前端是传文件类型给后台,末尾有正解,耐心看!

效果图:

5.实际需求补充:

①待导入的Excel中的字段有可能对应数据库中的多张表,那该怎么处理呢?

1>待导入Excel文件截图

该表中的字段对应数据库中的两个表,person以及staff,另外staff中的person_id是两表连接的桥梁

person表

staff表

2>自定义接受实体类

切记,这里不要忘了申明personId,后面这个是关键

3>配置mybatis获取自增主键值

这样配置了,就可以得到该插入数据的id,测试类

效果:

好了,既然能够的得到插入数据的id,重头戏在后头

4>通过调用Excel导入方法得到对应的list,然后解析相应的字段插入到对应的表

只有person真正插入了,得到主键值才能起作用

如果涉及到更多的表插入,需要理清表与表的连接桥梁,然后在按先后顺序插入;

访问效果:

person表

staff表

②上传文件接口入参怎么申明?前端代码怎么把参数传给后台?

1>前端传给后台的是file类型

2>后台的文件上传接口必须是post请求

3>待上传的excel

4>上传结果截图

附POI导入导出工具类:

这几天在做酒店系统,里面有大量的报表需要导出(从数据库导出为Excel),另外在做测试的时候又需要往数据库里面导入很多测试数据(从Excel导入数据库),基于以上两点原因学习了POI,自己封装了两个工具类,一个导出用,一个导入用,自己测试了一下,发现效果还是蛮好的!


(1)使用须知

  • 在编写工具类时,考虑到要兼容以前的Excel版本,所以用的是HSSF,也就是默认支持的是Office2003,也就是说呢:你导出的Excel文件是2003版的.xls文件,不是现在的.xlsx文件;而你要导入时,源文件Excel也必须是.xls的文件,不能使.xlsx文件(这里要注意,不是简单的把后缀名.xlsx改成.xls哦)! 解决方案:之所以这样做,是为了兼容旧版本!导出成.xls文件完全没问题,Office都是向下兼容的,新版本的Office完全可以打开.xls文件!导入也完全没问题,Office也同样支持.xls文件的创建,这里要注意,不是简单的把.xlsx后缀改成.xls,这样改后的文件是受损的,你可以点击Excel中的Office按钮,另存为时选择”Excel97-2003工作簿”在保存就没有问题了
  • 由于时间缘故,导出工具类没有进行优化,也就是从数据库导出成Excel时,必须保证导出的列表没有null的字段,否则会空指针的 解决方案:使用时自己优化一下,进入到导出工具类,在方法里面加上非空验证,把所有为null的字段都加上值”null”

(2)导出工具类

导出工具类(从数据库导出为Excel):


(3)导入工具类

导入工具类(从Excel导入到数据库):


(4)测试工具类

使用导出工具类,把数据库数据导出到E盘的book.xls文件中:

使用导入工具类,把E盘的book.xls文件中的数据导入到数据库中:


结束语

仔细看看周围的人,始终有那么一些人,坚定地在向前走着,他们变成闪闪发光的存在,总觉得他们就像是神似的存在这世界上,可是自己却不知道他们到底用了多少努力,才换来了这样的一个他们想要的人生。

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喔家ArchiSelf

消息队列在RTOS的应用

传说互联网应用有两大利器,一个是缓存,另一个就是消息队列。 一直相对消息队列做一下梳理,希望早日另有成文。 一叶知秋,实际上消息队列在嵌入式系统中同样有着广泛的...

1103
来自专栏专注于主流技术和业务

axios2教程

axios 是一个基于 promise 的 HTTP 库,用于浏览器和node.js的http客户端,支持拦截请求和响应,自动转换 JSON 数据, 客户端支持...

9912
来自专栏大内老A

关于WCF的一个非常“无语”的BUG!

这确实是一个让人觉得“无语”的BUG,甚至让我觉得微软在故意和我们开玩笑。这个问题在我刚刚接触WCF的时候就遇到过,换言之,这个问题一直存在于.NET 3.0、...

2057
来自专栏技术小讲堂

iBatis.Net(2):基本概念与配置

写完第一篇,有朋友给我发邮件,说想让我配合实例写会不会更好一些,可是呢,我觉得这就相当于那些北大的什么鸟给无辜的孩子们吃快餐一样,我是坚决反对那样的,知其然不知...

2837
来自专栏Java3y

从零单排学Redis【黄金】

好的,今天我们要上黄金段位了,如果还没经历过青铜和白银阶段的,可以先去蹭蹭经验再回来:

1312
来自专栏AndroidTv

讲讲断点续传那点儿事提问理论基础代码示例

这次想来讲讲断点续传,以前没相关需求,所以一直没去接触,近阶段了解了之后,其实并不复杂,那么也便来写一篇记录一下,分享给大伙,也方便自己后续查阅。

1052
来自专栏听雨堂

【7】AccessDB快速数据访问

阅读目录 C#和VB数据访问的比较 AccessDB的设计 数据库的连接 三种主要操作 错误输出及调试 小结 C#和VB数据访问的比较 C#中要进行...

20310
来自专栏前端杂货铺

Nodejs cluster模块深入探究

由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程、nginx的事件循环等。而对于nod...

56910
来自专栏小狼的世界

在Codeigniter框架中使用NuSOAP

NuSOAP 是一组功能强大的PHP类,这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写,可以无缝的与许多最...

921
来自专栏JavaEdge

操作系统之文件管理一、文件与文件系统二、文件控制块和文件目录三、文件的物理结构四、文件系统的实现五、文件系统实例(UNIX)六、UNIX文件系统一、文件系统实例(FAT)二、文件操作的实现三、文件系统

5996

扫码关注云+社区

领取腾讯云代金券