package com.example.demo.hutool;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import lombok.Data;
import org.junit.Test;
import java.util.List;
import java.util.Map;
/**
* @Description Hutool-poi是针对Apache POI的封装
*
* 使用Hutool的方法操作Office文件,Hutool提供的类有:
* ExcelUtil Excel工具类,读取的快捷方法都被封装于此。
* ExcelReader Excel读取器,Excel读取的封装,可以直接构造后使用。
* ExcelWriter Excel生成并写出器,Excel写出的封装(写出到流或者文件),可以直接构造后使用。
*
* ExcelReader类的主要方法:
* 构造器:
* ExcelReader(File bookFile, int sheetIndex)
* ExcelReader(File bookFile, String sheetName)
* ExcelReader(InputStream bookStream, int sheetIndex)
* ExcelReader(InputStream bookStream, String sheetName)
* ExcelReader(String excelFilePath, int sheetIndex)
* ExcelReader(org.apache.poi.ss.usermodel.Workbook book, int sheetIndex)
* ExcelReader(org.apache.poi.ss.usermodel.Workbook book, String sheetName)
*
* 方法:
* ExcelReader addHeaderAlias(String header, String alias) 增加标题别名
* Map<String,String> getHeaderAlias() 获得标题行的别名Map
* ExcelWriter getWriter() 获取Excel写出器 在读取Excel并做一定编辑后,获取写出器写出
* boolean isIgnoreEmptyRow() 是否忽略空行
*
* List<List<Object>> read() 读取工作簿中指定的Sheet的所有行列数据
* void read(CellHandler cellHandler) 读取工作簿中指定的Sheet,此方法为类流处理方式,
* 当读到指定单元格时,会调用CellEditor接口,
* 用户通过实现此接口,可以更加灵活的处理每个单元格的数据。
* List<List<Object>> read(int startRowIndex) 读取工作簿中指定的Sheet
* List<List<Object>> read(int startRowIndex, int endRowIndex) 读取工作簿中指定的Sheet,此方法会把第一行作为标题行,替换标题别名
* void read(int startRowIndex, int endRowIndex, CellHandler cellHandler) 读取工作簿中指定的Sheet,此方法为类流处理方式,
* 当读到指定单元格时,会调用CellEditor接口,
* 用户通过实现此接口,可以更加灵活的处理每个单元格的数据。
* <T> List<T> read(int headerRowIndex, int startRowIndex, Class<T> beanType) 读取Excel为Bean的列表
* <T> T read(SheetReader<T> sheetReader) 读取数据为指定类型
* List<Map<String,Object>> readAll() 读取Excel为Map的列表,读取所有行,
* 默认第一行做为标题,数据从第二行开始,
* Map表示一行,标题为key,单元格内容为value
* <T> List<T> readAll(Class<T> beanType) 读取Excel为Bean的列表,读取所有行,默认第一行做为标题,数据从第二行开始
* String readAsText(boolean withSheetName) 读取为文本格式 使用ExcelExtractor 提取Excel内容
* Object readCellValue(int x, int y) 读取某个单元格的值
* List<Object> readRow(int rowIndex) 读取某一行数据
* ExcelReader removeHeaderAlias(String header) 去除标题别名
* ExcelReader setHeaderAlias(Map<String,String> headerAlias) 设置标题行的别名Map
* ExcelReader setIgnoreEmptyRow(boolean ignoreEmptyRow) 设置是否忽略空行
* ExcelReader setCellEditor(CellEditor cellEditor) 设置单元格值处理逻辑
* 当Excel中的值并不能满足我们的读取要求时,通过传入一个编辑接口,
* 可以对单元格值自定义,例如对数字和日期类型值转换为字符串等。
*
* @Auther guofeng.xie
* @Date 2020/11/15 16:02
*/
public class TestExcelReader {
/**
* ExcelReader类的使用
*
* 读取Excel内容的封装,
* 通过构造ExcelReader对象,指定被读取的Excel文件、流或工作簿,然后调用readXXX方法读取内容为指定格式。
*/
@Test
public void testExcelReader() {
//1. 读取Excel中所有行和列,都用列表表示(一行一行的读取)
//id name age
//1 小明 12
ExcelReader reader = ExcelUtil.getReader("static/test.xlsx");
List<List<Object>> readAll = reader.read();
for (List list : readAll) {
for (Object obj : list) {
System.out.println(obj);
}
}
//2. 读取为Map列表,默认第一行为标题行,Map中的key为标题,value为标题对应的单元格值。
//id:1
//name:小明
//age:12
ExcelReader reader2 = ExcelUtil.getReader("static/test.xlsx");
reader2.addHeaderAlias("name", "personName"); //增加标题别名
List<Map<String,Object>> maps = reader2.readAll();
for (Map map : maps) {
map.forEach((key, value) -> {
System.out.println(key + ":" + value);
});
}
//3. 读取为Bean列表,Bean中的字段名为标题,字段值为标题对应的单元格值。
//TestExcel.Person(id=1, name=小明, age=12)
ExcelReader reader3 = ExcelUtil.getReader("static/test.xlsx");
List<Person> all = reader3.readAll(Person.class);
for (Person person : all) {
System.out.println(person);
}
}
@Data
private static class Person {
private int id;
private String name;
private int age;
}
}