:如何把Excel的数据转换成java对象?POI的使用-经验观点免费ppt模版下载-道格办公

如何把Excel的数据转换成java对象?POI的使用

的数据转换成Java对象,可以使用Apache POI库来实现。下面是详细的步骤和示例代码: 0x01_直接上代码,将数据转换成Java对象: ```java import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.po


  • 0x01_直接上代码,将数据转换成Java对象

  • 0x02_POI 介绍

  • 0x03_Poi如何读取操作表格?

  • 0x04_封装成工具类


如何把Excel的数据转换成java对象?POI的使用

最近的项目中用到了导入excel并且解析excel的业务,所以这里专门做个记录。

0x01_直接上代码,将数据转换成Java对象

提前准备了一个excel表,然后准备了一些数据:

image-20221128164436382

然后准备实体类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;
}
}

执行效果:

image-20221128165612246

就把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:单元格

image-20221128165857524

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

(810)
打赏 支付宝扫一扫 支付宝扫一扫
single-end

相关推荐