「养成习惯,先赞后看!!!」
本片文章的项目GitHub地址:https://github.com/haha143/rang-poi
如果可以的话,欢迎大家star!!!!!
1.前言
相信大家都应该看到过下面的功能:
![29746c10bff3d5d2b2233dd7932b7580.png](https://img-blog.csdnimg.cn/img_convert/29746c10bff3d5d2b2233dd7932b7580.png)
「文件的导入导出
」:
这个功能主要就是帮助我们的用户能够快速的将数据导入到数据库中,不用在自己手动的一条一条的将数据新增到我们的数据库中.同时又能够方便我们能够将数据导出之后打印出来给领导们查看.不用非得带着电脑这里那里的跑.非常实用的功能.
功能好是好,但是这样的功能我们又应该怎么来开发呢,主要用到的技术又有那些呢?知道该用那些技术之后,我们又应该怎么来使用呢?相信大家肯定都有这样那样的困扰,正是因为大家有这样那样的困扰,所以就更加需要看看这篇文章了.这里我会用「案例+代码+源码」的方式带大家更好的学习这方面的知识.
文件的导入导出功能目前主要是两家独大,一个就是Apache的POI
,另一家就是阿里的EasyExcel
.这里两种技术我都会在下面的文章里面详细讲解.
2.POI:
2.1-POI介绍:
POI的全称是: 「Poor Obfuscation Implementation」 ,意思是可怜的模糊实现.说是可怜但是一点都不可怜.是由Apache公司用Java开发并且免费开源的一套Java Api.
它能够帮助我们简单快速的对Excel的数据进行读写的操作.他不仅支持Excel,同时也支持PowerPoint,Word等等,但是这两者我们就暂时不讲,我们主要需要了解的就是关于Excel的操作.
POI所需的依赖:
org.apache.poipoi3.9
org.apache.poipoi-ooxml3.9
joda-timejoda-time2.10.1
junitjunit4.12
2.2-03版Excel与07版Excel区别
在使用POI之前,我们需要先了解一下Excel的版本更替,这样能够方便我们更好的了解POI的使用.
这里面Excel主要就是有两类,分别是「Excel03版本」和「Excel07版本」
这两个版本之间主要有以下的差别:
两者数据量都是有限制的
03版本行数最多只能到65536,列数最多只能到256
03版本行数最多只能到1048576 ,列数最多只能到16384
03版本:
行数限制:
![6022e8a8e38458c1301c11b7d3e9cb3f.png](https://img-blog.csdnimg.cn/img_convert/6022e8a8e38458c1301c11b7d3e9cb3f.png)
列数限制:
9*29+22=256(简单的四则运算)
![110f6cab55238e2bda18af42eff7acd2.png](https://img-blog.csdnimg.cn/img_convert/110f6cab55238e2bda18af42eff7acd2.png)
07版本:
行数限制:
![65b0f96d648f9a94cfe9926de0fd90eb.png](https://img-blog.csdnimg.cn/img_convert/65b0f96d648f9a94cfe9926de0fd90eb.png)
列数限制:
![49f08b01d846caf9156b43289d51593e.png](https://img-blog.csdnimg.cn/img_convert/49f08b01d846caf9156b43289d51593e.png)
- 两者的文件名后缀也不一样,03版本的后缀是xls,07版本的后缀是xlsx,既然两者的后缀不一样就说明操作两者的工具类肯定也就是不一样的,这一点我们会在下面的代码中着重体现,其次就是 「.xlsx文件比.xls的压缩率高,也就是相同数据量下,.xlsx的文件会小很多。」
2.3-数据写入操作
知道上述两者的差异之后,才能更好的方便我们下面处理我们编写过程中可能遇到的bug.
其次在java中有一个非常重要的理念就是"「万物皆对象
」",所以我们想要操作Excel表格的话,就要知道表格具体是由那些对象构成的.
![11cf3fd698f545a1a295040f80f30ebd.png](https://img-blog.csdnimg.cn/img_convert/11cf3fd698f545a1a295040f80f30ebd.png)
具体分下来主要就是图中标注出来的几种对象:「工作簿,工作表,行,单元格」
了解完有上述对象之后,我们就通过一个简单的案例来帮助大家更好的 了解这个概念.
具体代码实现:
- 03版本-HSSFWorkbook:
@Test
public void testExcel03() throws Exception{
//创建一个工作簿
Workbook workbook=new HSSFWorkbook();
//创建一张工作表
Sheet sheet=workbook.createSheet("我是一个新表格");
//创建一行即(1,1)的单元格
Row row1=sheet.createRow(0);
Cell cell11=row1.createCell(0);
//往该单元格中填充数据
cell11.setCellValue("姓名");
//创建(1,2)单元格
Cell cell12=row1.createCell(1);
cell12.setCellValue("印某人");
Row row2=sheet.createRow(1);
Cell cell21=row2.createCell(0);
cell21.setCellValue("注册日期");
Cell cell22=row2.createCell(1);
String time=new DateTime().toString("yyyy-MM-dd HH:mm:ss");
cell22.setCellValue(time);
//创建文件流
FileOutputStream fileOutputStream=new FileOutputStream(PATH+"登记表03.xls");
//把文件流写入到工作簿中
workbook.write(fileOutputStream);
//关闭文件流
fileOutputStream.close();
System.out.println("文件生成成功");
}
运行完代码之后我们就可以看到我们的文件夹下面就生成了「登记表03.xls」这样一个文件
![f385289803c11da8d8d264f8093e1bd2.png](https://img-blog.csdnimg.cn/img_convert/f385289803c11da8d8d264f8093e1bd2.png)
打开文件之后我们也能发现,数据的确已经写进来了.
![c31b45fed0e83556c8cf8bbccc5273c0.png](https://img-blog.csdnimg.cn/img_convert/c31b45fed0e83556c8cf8bbccc5273c0.png)
- 07版本-XSSFWorkbook:
@Test
public void testExcel07()throws Exception{
//注意只有这里创建的对象是不一样的!!!!!
Workbook workbook=new XSSFWorkbook();
Sheet sheet=workbook.createSheet("我是一个新表格");
Row row1=sheet.createRow(0);
Cell cell11=row1.createCell(0);
cell11.setCellValue("姓名");
Cell cell12=row1.createCell(1);
cell12.setCellValue("印某人");
Row row2=sheet.createRow(1);
Cell cell21=row2.createCell(0);
cell21.setCellValue("注册日期");
Cell cell22=row2.createCell(1);
String time=new DateTime().toString("yyyy-MM-dd HH:mm:ss");
cell22.setCellValue(time);