【Apache POI】Excel操作(七):Excel数据的读取(进阶版)

上帝,请赐予我平静,接受我无法改变的;请赐予我勇气,改变我能改变的;请赐予我智慧,分辨这两者的区别。

前言

在之前的博客:【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大数据量的写入

【Apache POI】Excel操作(五):Excel数据的读取

【Apache POI】Excel操作(六):Excel计算公式的读取和使用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值