com.whaleal.icefrog.poi.excel.ExcelReader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of icefrog-poi Show documentation
Show all versions of icefrog-poi Show documentation
icefrog POI工具类(对MS Office操作)
The newest version!
package com.whaleal.icefrog.poi.excel;
import com.whaleal.icefrog.core.io.FileUtil;
import com.whaleal.icefrog.core.lang.Precondition;
import com.whaleal.icefrog.poi.excel.cell.CellEditor;
import com.whaleal.icefrog.poi.excel.cell.CellHandler;
import com.whaleal.icefrog.poi.excel.cell.CellUtil;
import com.whaleal.icefrog.poi.excel.reader.BeanSheetReader;
import com.whaleal.icefrog.poi.excel.reader.ListSheetReader;
import com.whaleal.icefrog.poi.excel.reader.MapSheetReader;
import com.whaleal.icefrog.poi.excel.reader.SheetReader;
import org.apache.poi.ss.extractor.ExcelExtractor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Excel读取器
* 读取Excel工作簿
*
* @author Looly
* @author wh
* @since 1.0.0
*/
public class ExcelReader extends ExcelBase {
/**
* 是否忽略空行
*/
private boolean ignoreEmptyRow = true;
/**
* 单元格值处理接口
*/
private CellEditor cellEditor;
/**
* 标题别名
*/
private Map headerAlias = new HashMap<>();
// ------------------------------------------------------------------------------------------------------- Constructor start
/**
* 构造
*
* @param excelFilePath Excel文件路径,绝对路径或相对于ClassPath路径
* @param sheetIndex sheet序号,0表示第一个sheet
*/
public ExcelReader( String excelFilePath, int sheetIndex ) {
this(FileUtil.file(excelFilePath), sheetIndex);
}
/**
* 构造
*
* @param bookFile Excel文件
* @param sheetIndex sheet序号,0表示第一个sheet
*/
public ExcelReader( File bookFile, int sheetIndex ) {
this(WorkbookUtil.createBook(bookFile), sheetIndex);
}
/**
* 构造
*
* @param bookFile Excel文件
* @param sheetName sheet名,第一个默认是sheet1
*/
public ExcelReader( File bookFile, String sheetName ) {
this(WorkbookUtil.createBook(bookFile), sheetName);
}
/**
* 构造
*
* @param bookStream Excel文件的流
* @param sheetIndex sheet序号,0表示第一个sheet
*/
public ExcelReader( InputStream bookStream, int sheetIndex ) {
this(WorkbookUtil.createBook(bookStream), sheetIndex);
}
/**
* 构造
*
* @param bookStream Excel文件的流
* @param sheetName sheet名,第一个默认是sheet1
*/
public ExcelReader( InputStream bookStream, String sheetName ) {
this(WorkbookUtil.createBook(bookStream), sheetName);
}
/**
* 构造
*
* @param book {@link Workbook} 表示一个Excel文件
* @param sheetIndex sheet序号,0表示第一个sheet
*/
public ExcelReader( Workbook book, int sheetIndex ) {
this(book.getSheetAt(sheetIndex));
}
/**
* 构造
*
* @param book {@link Workbook} 表示一个Excel文件
* @param sheetName sheet名,第一个默认是sheet1
*/
public ExcelReader( Workbook book, String sheetName ) {
this(book.getSheet(sheetName));
}
/**
* 构造
*
* @param sheet Excel中的sheet
*/
public ExcelReader( Sheet sheet ) {
super(sheet);
}
// ------------------------------------------------------------------------------------------------------- Constructor end
// ------------------------------------------------------------------------------------------------------- Getters and Setters start
/**
* 是否忽略空行
*
* @return 是否忽略空行
*/
public boolean isIgnoreEmptyRow() {
return ignoreEmptyRow;
}
/**
* 设置是否忽略空行
*
* @param ignoreEmptyRow 是否忽略空行
* @return this
*/
public ExcelReader setIgnoreEmptyRow( boolean ignoreEmptyRow ) {
this.ignoreEmptyRow = ignoreEmptyRow;
return this;
}
/**
* 设置单元格值处理逻辑
* 当Excel中的值并不能满足我们的读取要求时,通过传入一个编辑接口,可以对单元格值自定义,例如对数字和日期类型值转换为字符串等
*
* @param cellEditor 单元格值处理接口
* @return this
*/
public ExcelReader setCellEditor( CellEditor cellEditor ) {
this.cellEditor = cellEditor;
return this;
}
/**
* 获得标题行的别名Map
*
* @return 别名Map
*/
public Map getHeaderAlias() {
return headerAlias;
}
/**
* 设置标题行的别名Map
*
* @param headerAlias 别名Map
* @return this
*/
public ExcelReader setHeaderAlias( Map headerAlias ) {
this.headerAlias = headerAlias;
return this;
}
/**
* 增加标题别名
*
* @param header 标题
* @param alias 别名
* @return this
*/
public ExcelReader addHeaderAlias( String header, String alias ) {
this.headerAlias.put(header, alias);
return this;
}
/**
* 去除标题别名
*
* @param header 标题
* @return this
*/
public ExcelReader removeHeaderAlias( String header ) {
this.headerAlias.remove(header);
return this;
}
// ------------------------------------------------------------------------------------------------------- Getters and Setters end
/**
* 读取工作簿中指定的Sheet的所有行列数据
*
* @return 行的集合,一行使用List表示
*/
public List> read() {
return read(0);
}
/**
* 读取工作簿中指定的Sheet
*
* @param startRowIndex 起始行(包含,从0开始计数)
* @return 行的集合,一行使用List表示
* @since 1.0.0
*/
public List> read( int startRowIndex ) {
return read(startRowIndex, Integer.MAX_VALUE);
}
/**
* 读取工作簿中指定的Sheet,此方法会把第一行作为标题行,替换标题别名
*
* @param startRowIndex 起始行(包含,从0开始计数)
* @param endRowIndex 结束行(包含,从0开始计数)
* @return 行的集合,一行使用List表示
*/
public List> read( int startRowIndex, int endRowIndex ) {
return read(startRowIndex, endRowIndex, true);
}
/**
* 读取工作簿中指定的Sheet
*
* @param startRowIndex 起始行(包含,从0开始计数)
* @param endRowIndex 结束行(包含,从0开始计数)
* @param aliasFirstLine 是否首行作为标题行转换别名
* @return 行的集合,一行使用List表示
* @since 1.0.0
*/
public List> read( int startRowIndex, int endRowIndex, boolean aliasFirstLine ) {
final ListSheetReader reader = new ListSheetReader(startRowIndex, endRowIndex, aliasFirstLine);
reader.setCellEditor(this.cellEditor);
reader.setIgnoreEmptyRow(this.ignoreEmptyRow);
reader.setHeaderAlias(headerAlias);
return read(reader);
}
/**
* 读取工作簿中指定的Sheet,此方法为类流处理方式,当读到指定单元格时,会调用CellEditor接口
* 用户通过实现此接口,可以更加灵活的处理每个单元格的数据。
*
* @param cellHandler 单元格处理器,用于处理读到的单元格及其数据
* @since 1.0.0
*/
public void read( CellHandler cellHandler ) {
read(0, Integer.MAX_VALUE, cellHandler);
}
/**
* 读取工作簿中指定的Sheet,此方法为类流处理方式,当读到指定单元格时,会调用CellEditor接口
* 用户通过实现此接口,可以更加灵活的处理每个单元格的数据。
*
* @param startRowIndex 起始行(包含,从0开始计数)
* @param endRowIndex 结束行(包含,从0开始计数)
* @param cellHandler 单元格处理器,用于处理读到的单元格及其数据
* @since 1.0.0
*/
public void read( int startRowIndex, int endRowIndex, CellHandler cellHandler ) {
checkNotClosed();
startRowIndex = Math.max(startRowIndex, this.sheet.getFirstRowNum());// 读取起始行(包含)
endRowIndex = Math.min(endRowIndex, this.sheet.getLastRowNum());// 读取结束行(包含)
Row row;
short columnSize;
for (int y = startRowIndex; y <= endRowIndex; y++) {
row = this.sheet.getRow(y);
columnSize = row.getLastCellNum();
Cell cell;
for (short x = 0; x < columnSize; x++) {
cell = row.getCell(x);
cellHandler.handle(cell, CellUtil.getCellValue(cell));
}
}
}
/**
* 读取Excel为Map的列表,读取所有行,默认第一行做为标题,数据从第二行开始
* Map表示一行,标题为key,单元格内容为value
*
* @return Map的列表
*/
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy