前言
接下来我会出一系列关于如何用Java操作Excel的博客教程,欢迎有需要的小伙伴持续关注哦!
相信大家在开发的过程中难免遇到要进行Excel读写操作的任务。反正最近本博主就遇到了,因为缺乏相关经验,也是一边烦恼不知从何下手一边研究了一段时间,最后还算是完美的完成了任务。其实跟Java的文件读写操作没两样,而且使用一些工具的话,还要更加的简单。
前期准备
本篇博客的编码环境为:SpringBoot(Java框架
) + IDEA(开发工具
),若是有不会搭建环境的小伙伴可以参考我的这两篇博客哦:
或者
POI基本介绍
说到Java操作excel,我们当然不可能用原生的JAVAIO流
代码去写,那样效率未免有些低下。这里隆重的给大家介绍由Apache提供的工具Apache POI
(当然之后也会给大家介绍有Alibaba提供的工具EasyExcel
,使用起来更加的方便,不过其实也是在Apache POI
上面进行了封装)。
首先,我们来到Apache POI根正苗红的官网:http://poi.apache.org/
然后,你会很惊喜的发现:似乎看不出什么名堂,也不知道怎么使用。
我们直接来到百度百科就好了:点击这里,进行跳转
我们看到最开始的简介中的:
POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
也就是说,Apache POI
不光能操作Excel的读写,还能操作其他的Microsoft Office格式的文档,如我们常用的Word文档、PPT等。当然,本系列博客只涉及Excel的读写操作,至于其他格式的文档操作,读者可以自行研究。
Excel简单介绍
Excel版本介绍
首先,我们看到百度百科中关于Apache POI
基本功能关于Excel的介绍:
我们会发现Excel有两个版本,分别是HSSF
以及XSSF
:
- HSSF - 提供读写Microsoft Excel格式档案的功能。
- XSSF - 提供读写Microsoft Excel OOXML格式档案的功能
那么,这两个版本有什么区别呢?
首先,文件的后缀名不同:
-
HSSF
版本为03版本的Excel文件 — 它的后缀名为.xls
-
XSSF
版本为07版本的Excel文件 — 它的后缀名为.xlsx
如图所示:
其次,03版本的.xls
Excel文件最多为65536行:
而,07版本的.xlsx
Excel文件则最多为1048576行,刚好是65536也就是03版本的**16倍**
:
Excel基本元素
我们都知道在Java中万物皆可为对象,那么我们在Java中操作Excel都是操作哪些对象呢?
这里我就不卖关子了,它们分别是:
- 工作簿
- 工作表
- 行
- 列
如图所示:
毕竟,我们只有精确到哪个工作簿 -> 哪个工作表 -> 哪行 -> 哪列,才能明确到具体的单元格!!!
开整
导入依赖
首先,我们在SpringBoot工程的依赖管理文件pom.xml
中导入我们所需要的依赖:
<!-- xls(03) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- xlsx(07) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- 日期格式化工具 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
本地写入
本地写入的话,为了方便我们直接写入到当前.java文件所在的路径就好了。
在IDEA中,要快速获取当前的绝对路径的话:
首先,鼠标右键当前的包,然后选择
Copy Path...
:
其次,鼠标左键选择
Absolute Path
,然后再粘贴即可:
03版本 or 07版本?
用
POI
操作Excel选择03版本,还是07版本。除了所需的依赖不同之外,代码上只有最开始的创建工作簿的代码一行以及生成文件名的后缀不同而已。
如,03版本,后缀名为.xls
,创建工作簿代码为:
// 创建一张工作簿
Workbook workbook = new HSSFWorkbook();
而,07版本,后缀名为.xlsx
,创建工作簿代码为:
// 创建一张工作簿
Workbook workbook = new XSSFWorkbook();
03版本
03版本本地写入excel代码如下:
package com.guqueyue.excel;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.joda.time.DateTime;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
/**
* @ClassName ExcelWriteTest
* @Description 写入03版本Excel测试
* @Author 古阙月
* @Date 2020/10/31 21:43
* @Version 1.0
**/
public class ExcelWriteTest {
/**
* 需要写入excel的路径
*/
private static final String PATH = "C:\\project\\study_demo\\springboot_demo\\src\\main\\java\\com\\guqueyue\\excel";
@Test
public void write03Test() throws Exception {
// 创建一张工作簿
Workbook workbook = new HSSFWorkbook();
// 创建一张工作表
Sheet sheet1 = workbook.createSheet("古阙月书单");
/**
* 创建第一行
*/
Row row1 = sheet1.createRow(0);
// 创建第一行第一列
Cell cell11 = row1.createCell(0);
// 填值
cell11.setCellValue("书名");
// 创建第一行第二列
Cell cell12 = row1.createCell(1);
// 填值
cell12.setCellValue("作者");
// 创建第一行第三列
Cell cell13 = row1.createCell(2);
// 填值
cell13.setCellValue("时间");
/**
* 创建第二行
*/
Row row2 = sheet1.createRow(1);
// 创建第二行第一列
Cell cell21 = row2.createCell(0);
// 填值
cell21.setCellValue("《平凡的世界》");
// 创建第二行第二列
Cell cell22 = row2.createCell(1);
// 填值
cell22.setCellValue("路遥");
// 创建第二行第三列
Cell cell23 = row2.createCell(2);
// 填值
cell23.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
// 用IO流生成一张Excel表(03版本)- 后缀.xls
FileOutputStream fileOutputStream = new FileOutputStream(PATH + File.separator + "古阙月的书单表03.xls");
// 写入
workbook.write(fileOutputStream);
// 关流
fileOutputStream.close();
System.out.println("古阙月的书单表03.xls生成完毕!!!");
}
}
运行write03Test()
方法,可以看到控制台一道绿光闪过,控制台打印出了古阙月的书单表03.xls生成完毕!!!,也生成了名为古阙月的书单表03.xls的文件:
点开一看,分毫不差,非常棒:
07版本
07版本本地写入excel代码如下:
package com.guqueyue.excel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
/**
* @ClassName ExcelWriteTest
* @Description 写入07版本Excel测试
* @Author 古阙月
* @Date 2020/10/31 21:43
* @Version 1.0
**/
public class ExcelWriteTest2 {
/**
* 需要写入excel的路径
*/
private static final String PATH = "C:\\project\\study_demo\\springboot_demo\\src\\main\\java\\com\\guqueyue\\excel";
/**
* 需要写入excel的文件名称
*/
private static final String FILENAME = "古阙月的书单表07.xlsx";
@Test
public void write07Test() throws Exception {
// 创建一张工作簿
Workbook workbook = new XSSFWorkbook();
// 创建一张工作表
Sheet sheet1 = workbook.createSheet("古阙月书单2");
/**
* 创建第一行
*/
Row row1 = sheet1.createRow(0);
// 创建第一行第一列
Cell cell11 = row1.createCell(0);
// 填值
cell11.setCellValue("书名");
// 创建第一行第二列
Cell cell12 = row1.createCell(1);
// 填值
cell12.setCellValue("作者");
// 创建第一行第三列
Cell cell13 = row1.createCell(2);
// 填值
cell13.setCellValue("时间");
/**
* 创建第二行
*/
Row row2 = sheet1.createRow(1);
// 创建第二行第一列
Cell cell21 = row2.createCell(0);
// 填值
cell21.setCellValue("《挪威的森林》");
// 创建第二行第二列
Cell cell22 = row2.createCell(1);
// 填值
cell22.setCellValue("村上春树");
// 创建第二行第三列
Cell cell23 = row2.createCell(2);
// 填值
cell23.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
// 用IO流生成一张Excel表(03版本)- 后缀.xlsx
FileOutputStream fileOutputStream = new FileOutputStream(PATH + File.separator + FILENAME);
// 写入
workbook.write(fileOutputStream);
// 关流
fileOutputStream.close();
System.out.println(FILENAME + "生成完毕!!!");
}
}
同样的,运行write07Test()
方法,可以看到控制台一道绿光闪过,控制台打印出了古阙月的书单表07.xlsx生成完毕!!!,也生成了名为古阙月的书单表07.xlsx的文件:
点开一看,也是分毫不差,非常棒:
好了,使用Apache POI
实现Excel基本的写入操作就完成了。敬请期待下期博客哦!!!
在本期博客中给大家介绍了Apache POI在本地写入Excel的基本操作。但可能很多朋友就会问了:在实际操作中,我们一般都是采用实体类集合来写入数据的吧。总不可能一个单元格一个单元格去填写吧?
是的。所以下期博客来了,给大家带来一个进阶版,通过实体类集合来写入数据:
参考资料:【狂神说Java】POI及EasyExcel一小时搞定通俗易懂