excel

public abstract class BaseImportExcelBase {

/**
* 解析Excel文件返回List数据集合
*
* @param file
* @return
*/
public List<List<Object>> importExcel(MultipartFile file) {
ExcelReader excelReader = ExcelFileUtil.getReader(file);
// 校验列完整性
List<Object> columnTabNames = excelReader.readRow(BigDecimal.ZERO.intValue());
checkColumn(columnTabNames);
// 校验数据
List<List<Object>> rows = excelReader.read(BigDecimal.ONE.intValue());
checkData(rows);

return rows;
}

/**
* 解析Excel文件返回List数据Bean
*
* @param file
* @return
*/
public <T> List<T> importExcelBean(MultipartFile file, Class<T> beanType) throws Exception {
// 返回的数据
List<T> beanList = new ArrayList<>();
ExcelReader excelReader = ExcelFileUtil.getReader(file);
// 校验列完整性
checkColumn(excelReader.readRow(BigDecimal.ZERO.intValue()));
// 读入数据
List<List<Object>> rows = excelReader.read(BigDecimal.ONE.intValue());
checkData(rows);
for (int i = 0; i < rows.size(); i++) {
List<Object> row = rows.get(i);
// 每一行数据转换
T bean = dataToBean(beanType, row,i);
beanList.add(bean);
}
return beanList;
}

/**
* 读取大数据量的Excel
* 通过Sax方式读取Excel,同时支持03和07格式
*
* @param file Excel文件
* @param beanType bean类型
*/
public <T> List<T> importExcelRowHandlerBean(MultipartFile file, Class<T> beanType) {
// 返回的数据
List<T> beanList = new ArrayList<>();
ExcelUtil.readBySax(FileUtil.toFile(file), BigDecimal.ZERO.intValue(), (sheetIndex, rowIndex, rowList) -> {
if (rowIndex == BigDecimal.ZERO.intValue()) {
// 校验列完整性
checkColumn(rowList);
} else {
boolean isBlank = rowList.stream().anyMatch(e -> ObjectUtil.isNotEmpty(e));
if (isBlank) {
// 每一行数据转换
T bean = null;
try {
bean = dataToBean(beanType, rowList,(int)rowIndex);
} catch (Exception e) {
throw new BizException(e.getMessage());
}
beanList.add(bean);
}

}
});

return beanList;
}

/**
* 读取大数据量的Excel
* 通过Sax方式读取Excel,同时支持03和07格式
*
* @param file Excel文件
* @param rowHandler 行处理器
*/
public void importExcelRowHandler(MultipartFile file, RowHandler rowHandler) {
ExcelUtil.readBySax(FileUtil.toFile(file), BigDecimal.ZERO.intValue(), (sheetIndex, rowIndex, rowList) -> {
if (rowIndex == BigDecimal.ZERO.intValue()) {
// 校验列完整性
checkColumn(rowList);
} else {
// 校验数据完整性
checkRowData(rowList);
rowHandler.handle(sheetIndex, rowIndex, rowList);
}
});
}

/**
* 检验表格列完整性
*
* @param columnTabNames 表头数据
* @return
*/
protected abstract void checkColumn(List<Object> columnTabNames);

/**
* 校验数据,使用importExcel方法时使用
*
* @param rows 所有行的数据
* @return
*/
protected abstract void checkData(List<List<Object>> rows);

/**
* 校验数据,使用importExcelRowHandler方法时使用
*
* @param rows 每一行的数据
* @return
*/
protected abstract void checkRowData(List<Object> rows);

/**
* 将每一行的数据转成bean
*
* @param beanType
* @param rowData
* @return
* @throws Exception
*/
private <T> T dataToBean(Class<T> beanType, List<Object> rowData,int rowIndex) throws Exception {
// 该bean的所有字段
Field[] fields = beanType.getDeclaredFields();

// bean实例
T bean = beanType.newInstance();
for (Field field : fields) {
if (field.isAnnotationPresent(ExcelField.class)) {
field.setAccessible(true);
ExcelField annotation = field.getAnnotation(ExcelField.class);
// 列数
int column = annotation.column();
// 是否必填
boolean required = annotation.required();
// 错误信息
String errorMsg = annotation.errorMsg();

// 每列数据
String columnData = "";
try {
columnData = Optional.ofNullable(rowData.get(column)).orElse("").toString();
} catch (Exception e) {
//throw new BizException(e.getMessage());
columnData="";
}

// 校验数据
if (required && StrUtil.isBlank(columnData)) {
throw new BizException("[row index "+(rowIndex+1)+"]"+errorMsg);
}

field.set(bean, StrUtil.trim(columnData));
}
}

return bean;
}
}

posted @   yydssc  阅读(225)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示