@@ -9,9 +9,11 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil ;
import cn.hutool.core.util.StrUtil ;
import cn.hutool.poi.excel.cell.CellEditor ;
import cn.hutool.poi.excel.cell.CellHandler ;
import cn.hutool.poi.excel.cell.CellUtil ;
import org.apache.poi.hssf.usermodel.HSSFWorkbook ;
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 ;
@@ -34,14 +36,21 @@ import java.util.Map;
*/
public class ExcelReader extends ExcelBase < ExcelReader > {
/** 是否忽略空行 */
/**
* 是否忽略空行
*/
private boolean ignoreEmptyRow = true ;
/** 单元格值处理接口 */
/**
* 单元格值处理接口
*/
private CellEditor cellEditor ;
/** 标题别名 */
/**
* 标题别名
*/
private Map < String , String > headerAlias = new HashMap < > ( ) ;
// ------------------------------------------------------------------------------------------------------- Constructor start
/**
* 构造
*
@@ -125,6 +134,7 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
// ------------------------------------------------------------------------------------------------------- Constructor end
// ------------------------------------------------------------------------------------------------------- Getters and Setters start
/**
* 是否忽略空行
*
@@ -228,7 +238,7 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
* @param endRowIndex 结束行( 包含, 从0开始计数)
* @return 行的集合, 一行使用List表示
*/
@SuppressWarnings ( { " rawtypes " , " unchecked " } )
@SuppressWarnings ( { " rawtypes " , " unchecked " } )
public List < List < Object > > read ( int startRowIndex , int endRowIndex ) {
checkNotClosed ( ) ;
List < List < Object > > resultList = new ArrayList < > ( ) ;
@@ -255,6 +265,45 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
return resultList ;
}
/**
* 读取工作簿中指定的Sheet, 此方法为类流处理方式, 当读到指定单元格时, 会调用CellEditor接口<br>
* 用户通过实现此接口,可以更加灵活的处理每个单元格的数据。
*
* @param cellHandler 单元格处理器,用于处理读到的单元格及其数据
* @since 5.3.8
*/
public void read ( CellHandler cellHandler ) {
read ( 0 , Integer . MAX_VALUE , cellHandler ) ;
}
/**
* 读取工作簿中指定的Sheet, 此方法为类流处理方式, 当读到指定单元格时, 会调用CellEditor接口<br>
* 用户通过实现此接口,可以更加灵活的处理每个单元格的数据。
*
* @param startRowIndex 起始行( 包含, 从0开始计数)
* @param endRowIndex 结束行( 包含, 从0开始计数)
* @param cellHandler 单元格处理器,用于处理读到的单元格及其数据
* @since 5.3.8
*/
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的列表, 读取所有行, 默认第一行做为标题, 数据从第二行开始<br>
* Map表示一行, 标题为key, 单元格内容为value
@@ -420,6 +469,7 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
}
// ------------------------------------------------------------------------------------------------------- Private methods start
/**
* 读取一行
*
@@ -443,7 +493,7 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
return result ;
}
for ( int i = 0 ; i < size ; i + + ) {
for ( int i = 0 ; i < size ; i + + ) {
result . add ( aliasHeader ( headerList . get ( i ) , i ) ) ;
}
return result ;
@@ -458,7 +508,7 @@ public class ExcelReader extends ExcelBase<ExcelReader> {
* @since 4.3.2
*/
private String aliasHeader ( Object headerObj , int index ) {
if ( null = = headerObj ) {
if ( null = = headerObj ) {
return ExcelUtil . indexToColName ( index ) ;
}