目录
五.在Spring Boot项目中将excel文件通过流传输给前端的方法
六.通过类加载器拿到位于Spring项目下resources文件夹里面的文件
一.使用场景
我们在spring项目里面可能经常会涉及到数据汇总报表的时候,此时后端就会通过Apache POI来对一些文件进行操作(例如 Excel和Word等),对这些文件操作之后后端就会通过将文件用过流传输给前端,从而在前端接收到对应的文件。
二.Apache POI 简介
Apache POI是Apache基金会的开源库,通过对应的API操作Microsoft Office格式的文件。
Apache POI官网地址:https://poi.apache.org/
它给我们提供了多个API以操作不同的文件格式
API | 介绍 |
HSSF | 主要用于读取和写入 Excel 97-2003 格式的 .xls 文件。HSSF 是较旧的格式,因此只能处理较小的文件,且不支持 Excel 2007 及以后版本的功能 |
XSSF | 主要用于读取和写入 Excel 2007+ 格式的 .xlsx 文件。与 HSSF 相比,XSSF 支持更多的功能和格式,如更大的工作表、更复杂的公式和更丰富的样式。XSSF 使用 XML 格式,因此可以处理较大的文件。 |
SXSSF | 适用于处理非常大的 Excel 文件(通常超过几百兆字节),以避免内存溢出。SXSSF 是基于 XSSF 的流式处理实现,它通过写入数据时逐行生成文件,避免将整个文件加载到内存中,从而有效节省内存。 |
HWPF | 用于处理 Microsoft Word 97-2003 格式的 .doc 文件。HWPF 允许你读取、修改并保存旧版 Word 文件。 |
HSLF | 用于处理 PowerPoint 97-2003 格式的 .ppt 文件。HSLF 提供了对 PowerPoint 幻灯片文件的读写支持,允许你创建和修改演示文稿。 |
由于在项目里面我们经常涉及到的是Excel表格的传输,我们这里讲解的是通过POI来对excel文件的读写操作。
三.Maven依赖引入
说明:第一个依赖引入是操作的老版本(97-2003)的Excel文件(即HSSF格式,文件后缀为.xls),第二个操作的是新版本(2007以后的,文件后缀为.xlsx)的Excel文件
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
四.Excel文件的读写操作
- Excel的写操作
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class POITest {
public static void main(String[] args) throws IOException {
write();
}
public static void write() throws IOException {
//创建一个Excel工作簿对象,对excel文件进行操作
XSSFWorkbook excel = new XSSFWorkbook();
//通过Excel对象,创建sheet页
XSSFSheet sheet = excel.createSheet("sheet1");
//创建sheet对象的时候可以指定这个sheet的名字,不传入名字的话就是按默认值来
//注意在通过Excel对象对每行或者是对单元格进行操作的时候均是从0开始的
//创建第2行,拿到这一行的row对象,来创建单元格
XSSFRow row = sheet.createRow(1);
//创建row对象这一行的第2个单元格
XSSFCell cell = row.createCell(1);
//给这一个单元格赋值
row.createCell(1).setCellValue("姓名");
//相同操作,可以链式调用
sheet.createRow(2).createCell(1).setCellValue("张三");
//通过XSSFWorkbook的write方法将这个excel文件写到本地磁盘,参数接收的是一个输出流
//这里可以使用OutputStream的包装流,我们就将这个文件写到本地的D盘的Exam文件夹下
FileOutputStream fileOutputStream = new FileOutputStream("D:/Exam/info.xlsx");
excel.write(fileOutputStream);
//关闭资源
fileOutputStream.close();
excel.close();
}
}
此时打开刚刚写入的文件
这里可以观察到数据已经写入了
可能会有人有疑问:为什么我们刚刚只创建了一个单元格为什么在打开这个excel文件的时候其他位置依然有单元格?
这是因为,在 Excel 中,只要创建了一个工作簿,Excel 会在显示时自动渲染整个工作表,即使很多单元格没有数据也会显示出来。你只看到填充了数据的单元格,而空的单元格通常看起来只是没有任何内容,但它们依然存在。但是对于我们在java代码中操作的时候我们创建了一个sheet页要创建这个行和这个行里面的列我们才能对这个单元格进行数据写入,当然我们如果是读取一个已经存在于磁盘中的excel文件就不用再这样操作了。
2.Excel文件的读操作
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class POITest {
public static void main(String[] args) throws IOException {
read();
}
public static void read() throws IOException {
//通过输入流拿到位于本地磁盘D:/Exam/info.xlsx的文件
FileInputStream fileInputStream = new FileInputStream("D:/Exam/info.xlsx");
//进入源码可以看见有一个构造函数能接收一个输入流并以此来读入这个输入流的excel文件
XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);
//通过指定的名字拿到这个sheet页
XSSFSheet sheet = excel.getSheet("sheet1");
//或者我们可以通过excel.getSheetAt()这个方法来拿到,这个方法是传入的sheet页的顺序来拿到的
//获取最后有数据的一行的index
int lastRowNum = sheet.getLastRowNum();
System.out.println("最后有数据的一行为:"+lastRowNum);
for (int i=1; i<=lastRowNum; i++) {
//获取指定单元格里面的数据
String value = sheet.getRow(i).getCell(1).getStringCellValue();
System.out.println(value);
}
//资源关闭
fileInputStream.close();
excel.close();
}
}
运行上面的代码得到结果
我们就成功的拿到了里面的数据
五.在Spring Boot项目中将excel文件通过流传输给前端的方法
我们在写项目的过程中可能会遇到将后端数据库的数据通过筛选最终填入到了excel文件中,但是可能不知道怎么将文件传到前端,此时我们就需要用到HttpServletResponse这个类了,我们在controller层将这个类作为参数,并将这个参数传入到service层,最后在service层封装好了excel文件之后我们获取这个HttpServletResponse的输出流对象即ServletOutputStream
这里给出我之前做过的代码给出一部分提示
controller层
service层部分代码
在使用ApAche POI的时候我们能够通过它的API来设置excel里面的字体的大小和单元格的背景色以及单元个合并等问题,但是我建议是先将对应的模板保存在磁盘里面,因为通过POI去设置excel里面的样式的步骤有点多,且我们在项目开发的时候导出数据的格式一般都是固定的,所以没有必要纠结于通过POI设置的问题
六.通过类加载器拿到位于Spring项目下resources文件夹里面的文件
我们在项目里面通常是会把静态资源保存在resources文件夹下面,所以我们可以使用类加载器来获取到resourse文件夹下的excel文件
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/info.xlsx");
-
this.getClass这部分获取当前对象的 类。
this
代表当前的对象,getClass()
方法返回当前对象的 Class 对象。 -
通过
getClass()
方法获取到的Class
对象,有一个方法叫做getClassLoader()
,它返回当前类的 类加载器。类加载器负责加载类和这个类路径下的资源文件等。 -
getResourceAsStream("template/info.xlsx")
:这个是获取资源文件里面的template文件夹的info.xlsx文件
注意:在idea开发中项目里面通过Maven创建项目的时候idea会自动将src/main/java
和 src/main/resources这两个目录加入到类路径中
本人的第一篇博客,以此来记录我的后端java学习。如文章中有什么问题请指出,非常感谢!!!