0x01_直接上代码,将数据转换成Java对象
0x02_POI 介绍
0x03_Poi如何读取操作表格?
0x04_封装成工具类
如何把Excel的数据转换成java对象?POI的使用
最近的项目中用到了导入excel并且解析excel的业务,所以这里专门做个记录。
0x01_直接上代码,将数据转换成Java对象
提前准备了一个excel表,然后准备了一些数据:
然后准备实体类Good
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Good {
private Integer id;
private String name;
private Integer count;
private Double price;
private String description;
}
然后写读取的逻辑:(依赖在下面提供了,用的是最新版poi的相关依赖)
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
public class PoiRead {
public static void main(String[] args) {
try {
List<Good> goods = read('xlsx的路径');
goods.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<Good> read(String path) throws Exception {
List<Good> goods = new ArrayList<>();
// 1. 创建输入流
FileInputStream fip = new FileInputStream(path);
// 2. 再输入流中获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook(fip);
// 3. 在工作簿中获取目标工作表
Sheet sheet = workbook.getSheetAt(0);
// 4. 获取工作表中的行数(有数据的)
int rowNum = sheet.getPhysicalNumberOfRows();
// 5. 遍历所有的行,但是要注意第一行标题不获取,所以从下标1开始获取
for(int i = 1;i<rowNum;i++){
// 获取所有行
Row row = sheet.getRow(i);
if(row!=null){
//用于保存每条数据的集合
List<String> list = new ArrayList<>();
for (Cell cell : row) {
if(cell!=null){
//设置单元格都是string类型
cell.setCellType(CellType.STRING);
//获取所有单元格数据
String value = cell.getStringCellValue();
if(value!=null&&!value.equals('')){
//将每个单元格的数据存储到集合中
list.add(value);
}
}
}
//把获取到的每一条数据封装成一个Product类型
if(list.size()>0){
Good good = new Good(Integer.parseInt(list.get(0)),list.get(1),Integer.parseInt(list.get(2)),Double.parseDouble(list.get(3)),list.get(4));
//将product封装到list集合中
goods.add(good);
}
}
}
return goods;
}
}
执行效果:
就把excel的一行一行数据转换成了一个个对象。
0x02_POI 介绍
Poi是由apache公司提供的Java编写的免费开源跨平台的Java API,提供让Java程序对Microsoft Office档案读和写的功能。也是目前针对Excel读写比较常用的实现方案。
使用前提,需要导入对应的依赖,在pom.xml
中
<!--poi相关依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
目前maven仓库的最新的。
Poi包结构:
HSSF —— 读写 Microsoft Excel xls(07版本之前的Excel)
XSSF —— 读写 Microsoft Excel OOXML XLSX(07版本之后的Excel)
HWPF —— 读写 Word
HSLF —— 读写 PowerPoint(PPT)
其实主要用的就是XSSF
0x03_Poi如何读取操作表格?
其实在Poi内部封装了一些对象,用过excel的估计都很好理解下面的概念:
XSSFWorkbook:工作簿
XSSFSheet:工作表
Row:行
Cell:单元格
0x04_封装成工具类
以上方法对于任何实体类都应该能够读取并且封装,所以考虑封装成一个工具类,这样就能处处使用了。
package com.bones.util;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.cglib.beans.BeanMap;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 对应的依赖2个:poi 5.2.3 poi-ooxml:5.2.3
*/
public class ExcelUtil {
/**
* 解析表格方法
* @param stream 文件输入流
* @param clazz 实体类类型
* @return 解析表格的结果
* @throws Exception
*/
public static <T> List<T> readExcel(FileInputStream stream, Class<T> clazz) throws Exception {
List<T> result = new ArrayList<>();
// 1. 输入流中获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook(stream);
// 2. 在工作簿中获取目标工作表
Sheet sheet = workbook.getSheetAt(0);
// 3. 获取工作表中的行数(先获取第一行数据,因为模板中第一行数据包含对应的字段)
int rowNum = sheet.getPhysicalNumberOfRows();
Row row = sheet.getRow(0);
// 4. 存储所有实体类对应属性的集合(用于映射)
List<String> key = new ArrayList<>();
// 5. 遍历第一行数据,遍历出所有要新增数据的属性,并且放入到key集合中
for (Cell cell : row) {
cell.setCellType(CellType.STRING);
key.add(cell.getStringCellValue());
}
//6. 遍历所有的正式数据,但是要注意第二行标题不获取,所以从下标2开始获取
for(int i = 2;i<rowNum;i++){
// 7. 获取所有行
row = sheet.getRow(i);
if(row!=null){
//8. 用于保存每条数据的Map,并且在Map中建立属性与数据的映射关系
Map<String,String> excelMap = new HashMap<>();
// 计数器用于映射数据使用
int j = 0;
// 9. 遍历所有单元格中的数据,并且把key和value(单元格的数据),放入到excelMap中进行映射
for (Cell cell : row) {
if(cell!=null){
//10. 把单元格中的所有数据格式设置为String
cell.setCellType(CellType.STRING);
//11. 获取所有单元格数据
String value = cell.getStringCellValue();
if(value!=null&&!value.equals('')){
//12. 将每个单元格的数据存储到集合中
excelMap.put(key.get(j),value);
j++;
}
}
}
// 12. 创建对应实体类类型
T t = clazz.newInstance();
/**
* Spring提供的BeanMap,通过反射的形式把Map中的数据映射到实体类中
*/
BeanMap beanMap = BeanMap.create(t);
beanMap.putAll(excelMap);
result.add(t);
}
}
return result;
}
}
文章为用户上传,仅供非商业浏览。发布者:Lomu,转转请注明出处: https://www.daogebangong.com/articles/detail/How%20to%20convert%20Excel%20data%20into%20java%20objects%20Use%20of%20POIs.html
评论列表(196条)
测试