本文主要是介绍springboot + poi实现基本的excel文件导入导出,包含数据导出导入时数据的其他需求校验,导出含有批注信息、导出含有图片信息、导出含有图表信息等的介绍等等,主要是一个demo尽可能简单明了的来介绍相关功能即可。有什么问题可以在留言哦!并在文章末尾附上demo源码下载!
一、前言
POI(Poor Obfuscation Implementation)是一个用于操作Microsoft Office格式文件的Java库。它提供了对Excel、Word和PowerPoint文件的读写功能,POI是一个功能强大的Java库,可以帮助开发人员在Java应用程序中处理Excel文件。无论是创建、编辑、读取还是导出数据,POI都提供了丰富的功能和灵活的接口。
单纯做数据的导出导入的话用easyExcel是比较方便,如果对数据导出有特殊要求的话,建议还是使用poi来按照需求进行设置,比如数据导入时数据校验,导入时数据的校验和单元格样式设置,导出含有批注信息、导出含有图片信息、导出含有图表信息等的介绍等等,这种情况还是poi的api用起比较舒服;注意如果不同版本的poi可能部分api是不兼容的,注意版本信息
实体类对应的excel表数据
二、导入依赖和创建自定义注解以及实体类
1、导入依赖
注意版本信息,不同的poi版本信息是不一样的;
经常在使用poi相关功能的时候,会导入一些其他模块依赖来支撑;其中场景的依赖如下:
poi模块:提供了对Microsoft Office格式文件的基本操作,如读取、写入和修改Excel、Word和PowerPoint文件。
poi-scratchpad模块:提供了对一些较新的Microsoft Office格式文件的支持,如Excel 2007及以上版本的xlsx文件。
poi-ooxml模块:提供了对Microsoft Office Open XML格式文件的支持,如xlsx、docx和pptx文件。
poi-ooxml-schemas模块:提供了对Microsoft Office Open XML格式文件的底层支持,包含了所有的XML Schema定义。
poi-excelant模块:提供了对Excel宏的支持,可以执行和操作Excel宏。
这些模块之间存在依赖关系,具体如下:
poi-scratchpad依赖于poi模块,扩展了poi模块的功能,使其能够处理较新的Excel格式文件。
poi-ooxml依赖于poi模块,提供了对Microsoft Office Open XML格式文件的支持。
poi-ooxml-schemas依赖于poi-ooxml模块,提供了对Microsoft Office Open XML格式文件的底层支持。
poi-excelant依赖于poi模块,提供了对Excel宏的支持。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
org.projectlombok
lombok
1.18.26
org.apache.poi
poi
3.17
org.apache.poi
poi-ooxml
3.17
2、自定义注解

3、创建实体类
package com.jdh.poi.excel.pojo;
import com.jdh.poi.excel.anno.PoiExcel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @ClassName: Admin
* @Author: jdh
* @CreateTime: 2022-08-03
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Admin {
@PoiExcel(cellIndex = 0, cellName = "编号")
private Integer id;
@PoiExcel(cellIndex = 1, cellName = "名称")
private String name;
@PoiExcel(cellIndex = 2, cellName = "区号")
private String zone;
@PoiExcel(cellIndex = 3, cellName = "能量值")
private Double energy;
@PoiExcel(cellIndex = 4, cellName = "创建时间")
private Date createTime;
@PoiExcel(cellIndex = 5, cellName = "备注")
private String remark;
}
三、excel导出导入的功能基本实现
其中包含数据导入时数据校验,导入时数据的校验和单元格样式设置,导出含有批注信息、导出含有图片信息、导出含有图表信息等的介绍等等
1、获取excel的基本数据信息
/**
* 获取excel的基本数据信息,如sheet、行、列等
*
* @return
* @throws Exception
*/
@Test
public void excelReadBasicInfo() throws Exception {
FileInputStream inputStream = new FileInputStream(path + "admin_basic.xlsx");
//下面就用到poi的api了
Workbook workbook = WorkbookFactory.create(inputStream);
// Workbook workbook = new XSSFWorkbook(inputStream);
int sheetCount = workbook.getNumberOfSheets();
System.out.println("Sheet数量:" + sheetCount);
for (int i = 0; i < sheetCount; i++) {
Sheet sheet = workbook.getSheetAt(i);
// 获取行数
int rowCount = sheet.getLastRowNum() + 1;
//获取表头列数
Row row0 = sheet.getRow(0);
int firstCellNum = row0.getLastCellNum();
// 获取表中最大列数
int columnMaxCount = 0;
for (int j = 0; j < rowCount; j++) {
Row row = sheet.getRow(j);
if (row != null) {
int currentColumnCount = row.getLastCellNum();
if (currentColumnCount > columnMaxCount) {
columnMaxCount = currentColumnCount;
}
}
}
//注意:若读取行列数,如果单元格设置了单元格格式或者写入数据又给删掉,那么这种情况会被认为时有效单元格,在统计行或列的时候会被统计出来,但是肉眼看则时空行或列
//在解析数据的时候也会去解析该单元格数据,会解析出一个空数据,所以在解析数据的时候就需要增加单元格数据类型校验
System.out.println("Sheet名称:" + sheet.getSheetName() + ";行数:" + rowCount + ";表头列数:" + firstCellNum + ";最大列数:" + columnMaxCount);
}
System.out.println();
workbook.close();
inputStream.close();
}
2、直接读取excel中的数据
/**
* 直接读取excel中的数据
*
* @return
* @throws FileNotFoundException
*/
@Test
public void excelRead() throws FileNotFoundException {
File file = new File(path + "admin_basic.xlsx");
String fileType = file.getName().substring(file.getName().lastIndexOf(".") + 1);
FileInputStream inputStream = null;
Workbook wb = null;
try {
inputStream = new FileInputStream(file);
//这里可以不用判断文件类型,直接使用WorkbookFactory来创建一个Workbook
//Workbook wb = WorkbookFactory.create(inputStream);
//判断是什么格式
if (fileType.equals("xlsx")) {
wb = new XSSFWorkbook(inputStream);
} else if (fileType.equals("xls")) {
wb = new HSSFWorkbook(inputStream);
}
Map>> allExcelData = new HashMap<>();
//获取当前excel文档的sheet页数
assert wb != null;
int sheetCount = wb.getNumberOfSheets();//sheet页数
//读取sheet的数据
for (int i = 0; i < sheetCount; i++) {
List> allSheetData = new ArrayList<>();//存储当前sheet的数据
//获取每一个sheet
Sheet sheet = wb.getSheetAt(i);
//每一个sheet的表名
String sheetName = sheet.getSheetName();
//获取每一页sheet的行数(包括标题行);若有的行单元格为设置了格式等操作但无数据,也会被计算的
int rows = sheet.getPhysicalNumberOfRows();
//读取每个sheet的行数据
for (int x = 0; x < rows; x++) {
ArrayList