cn.joylau.office.excel.support.AbstractExcelReader Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright (c) 2017 by JoyLau. All rights reserved
******************************************************************************/
package cn.joylau.office.excel.support;
import cn.joylau.office.excel.ExcelApi;
import cn.joylau.office.excel.ExcelReader;
import cn.joylau.office.excel.ExcelReaderWrapper;
import cn.joylau.office.excel.api.poi.POIExcelApi;
import cn.joylau.office.excel.config.AbstractExcelReaderCallBack;
import cn.joylau.office.excel.config.ExcelReaderCallBack;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* 抽象读取器,实现基本的读取功能,将excel解析为一行一行的数据并调用包装其进行包装
*/
public abstract class AbstractExcelReader implements ExcelReader {
protected ExcelApi api = POIExcelApi.getInstance();
public abstract ExcelReaderWrapper getWrapper();
@Override
public List readExcel(InputStream inputStream) throws Exception {
final List dataList = new ArrayList<>();
//回掉
ExcelReaderCallBack callBack = new AbstractExcelReaderCallBack() {
List header = new LinkedList<>();//表头信息
//行缓存,一行的数据缓存起来,读完一样进行对象包装后,清空,进行下一行读取
List temp = new LinkedList<>();
private int sheet =0;
@Override
public void onCell(ExcelReaderCallBack.CellContent content) throws Exception {
//下一个sheet,重置
if (content.getSheet() != sheet) {
header.clear();
temp.clear();
sheet = content.getSheet();
}
//已经被手动终止
if (getWrapper().isShutdown()) {
shutdown();
return;
}
boolean isHeader = isHeader(content, header);
if (isHeader) {
//如果该行为表头
header.add(String.valueOf(content.getValue()));
} else if (header.size() != 0) { //有表头才读取
temp.add(content);
//如果是最后一列,则代表本行已经读取完毕,调用包装器进行本行对象的实例化。
if (content.isLast()) {
dataList.add(wrapperRow(header, temp,sheet));
temp.clear();
}
}
}
};
api.read(inputStream, callBack);
return dataList;
}
/**
* 包装一个对象
*
* @param headers 表头信息
* @param contents 一行的数据
* @return 包装结果
* @throws Exception
*/
protected T wrapperRow(List headers, List contents,int sheet) throws Exception {
T instance = getWrapper().newInstance(sheet);//创建实例
for (int i = 0, len = contents.size(); i < len; i++) {
String header = null;
if (headers.size() >= i) {
header = headers.get(i);
}
//包装属性
getWrapper().wrapper(instance, header, contents.get(i).getValue());
}
getWrapper().wrapperDone(instance);
return instance;
}
/**
* 判断一个单元格是否为表头,默认判断条件为:表格的第一行就是表头
*
* @param content 单元格数据
* @param header 已有的表头
* @return 是否为表头
*/
protected boolean isHeader(ExcelReaderCallBack.CellContent content, List header) {
if (content.getRow() == 0) return true;
return false;
}
}