前言
在之前的博客:【Apache POI】Excel操作(五):Excel数据的读取 中,我们已经基本的介绍了Excel如何读取。
但可能很多朋友就会问了:在实际操作中,我们一般都是将数据读取到实体类集合中的吧。总不可能一个单元格一个单元格去读取吧?
是的。所以今天给大家带来一个进阶版,通过实体类集合来写入数据。
开整
excel
话不多说,直接开始,首先准备一个用于读取的excel文件,大家可以 点击进入这篇博客 ,用里面的方法直接生成一个excel文件:
依赖
本文所需依赖:
<!-- xls(03) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
实体类
用于创建集合装值的实体类:
package excel.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @ClassName BookList
* @Description 书单实体类
* @Author 古阙月
* @Date 2020/11/23 22:11
* @Version 1.0
*/
//lombok插件的注解
@Data // 若未使用lombok插件,请自行生成getter、setter以及toString方法
@AllArgsConstructor // 若未使用lombok插件,请自行生成有参构造方法
@NoArgsConstructor // 若未使用lombok插件,请自行生成无参构造方法
@Accessors(chain = true) // 开启链式编程
public class Book {
/**
* 书名
*/
private String bookName;
/**
* 作者
*/
private String author;
/**
* 时间
*/
private String dateTime;
}
代码
直接上代码,解释都在注释里:
package excel.read;
import excel.entity.Book;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.joda.time.DateTime;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @ClassName ExcelReadTest3
* @Description 将excel中的数据读取成实体类集合
* @Author 古阙月
* @Date 2020/11/24 22:33
* @Version 1.0
*/
public class ExcelReadTest3 {
/**
* 路径
*/
String PATH = "D:\\IdeaProjects\\my_study_demo\\src\\main\\java\\excel\\read";
/**
* 文件名
*/
String FILENAME = "古阙月的书单03.xls";
@Test
public void read() throws Exception {
// 创建实体类集合用于装值
List<Book> bookList = new ArrayList<Book>();
// 获取excel工作簿
FileInputStream in = new FileInputStream(PATH + File.separator + FILENAME);
Workbook workbook = new HSSFWorkbook(in);
if (workbook != null) {
// 拿到计算公式
FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);
// 获取第一个工作表
Sheet sheet = workbook.getSheetAt(0);
if (sheet != null) {
/**
* 获取内容部分
*/
int rows = sheet.getPhysicalNumberOfRows(); // 获取所有的行数
for (int i = 1; i < rows; i++) {
// 创建对象
Book book = new Book();
// 获取反射对象
Class<? extends Book> clazz = book.getClass();
// 获取所有的属性集合
Field[] fields = clazz.getDeclaredFields();
Row row = sheet.getRow(i); // 获取对应的行
if (row != null) {
int cells = row.getPhysicalNumberOfCells(); // 获取所有的列数
for (int j = 0; j < cells; j++) {
Cell cell = row.getCell(j); // 获取对应的列
if (cell != null) {
int cellType = cell.getCellType();
Object value = "";
switch (cellType) {
case HSSFCell.CELL_TYPE_STRING: // 字符串类型
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK: // 空
break;
case HSSFCell.CELL_TYPE_BOOLEAN: // 布尔类型
value = cell.getBooleanCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
if (HSSFDateUtil.isCellDateFormatted(cell)) { // 日期
Date date = cell.getDateCellValue();
value = new DateTime(date).toString("yyyy-MM-dd HH:mm:ss");
}else { // 普通数字
// 转成字符串,以防止过长无法显示
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
value = cell;
// value = cell.getNumericCellValue();
}
break;
case HSSFCell.CELL_TYPE_FORMULA: // 计算公式
// 计算
CellValue evaluate = formulaEvaluator.evaluate(cell);
// 转化成字符串
value = evaluate.formatAsString();
break;
case HSSFCell.CELL_TYPE_ERROR:
throw new RuntimeException("数据类型错误");
}
// 私有属性访问授权
fields[j].setAccessible(true);
// 装值
fields[j].set(book, value);
}
}
// 往集合中装入实体类
bookList.add(book);
}
}
}
}
// 输出实体类集合
bookList.forEach(book -> {
System.out.println(book);
});
}
}
运行read()
方法得:
完美!!!
往期回顾
以下是往期Excel操作的回顾:
【Apache POI】Excel操作(一):Excel本地写入基本操作的实现
【Apache POI】Excel操作(二):Excel本地写入基本操作的实现(进阶版)
【Apache POI】Excel操作(三):Excel在浏览器端即Web端写入操作的实现
【Apache POI】Excel操作(四):Excel大数据量的写入