背景
相比于读取excel到List<List<String>>对象中,抽象一个方法将excel数据直接一步读取到指定的类对象中,更为方便。
代码
通过类Class读取excel数据到对象
代码语言:javascript复制/**
* 使用Class来读取Excel
*
* @param inputStream Excel的输入流
* @param excelTypeEnum Excel的格式(XLS或XLSX)
* @return 返回 ClassList 的列表
*/
public static <T> List<T> readExcelConvertObjectList(InputStream inputStream, ExcelTypeEnum excelTypeEnum, Class<T> classT) {
return readExcelWithClassList(inputStream, excelTypeEnum, 1, classT);
}
/**
* 读取excel数据到数据对象
*
* @param inputStream 文件流
* @param excelTypeEnum 文件类型Excel的格式(XLS或XLSX)
* @param headLineNum 开始读取数据的行
* @param classT 转为对象的CLASS
* @param <T>
* @return
*/
public static <T> List<T> readExcelConvertObjectList(InputStream inputStream, ExcelTypeEnum excelTypeEnum,
@Nullable Integer headLineNum, Class<T> classT) {
if (headLineNum == null) {
headLineNum = 1;
}
return EasyExcel.read(inputStream).excelType(excelTypeEnum)
.registerConverter(new StringConverter())
.head(classT)
.sheet()
.headRowNumber(headLineNum)
.doReadSync();
}
StringConvert
代码语言:javascript复制import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
public class StringConverter implements Converter<String> {
@Override
public Class supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 将excel对象转成Java对象,这里读的时候会调用
*
* @param cellData NotNull
* @param contentProperty Nullable
* @param globalConfiguration NotNull
* @return
*/
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return cellData.getStringValue();
}
/**
* 将Java对象转成String对象,写出的时候调用
*
* @param value
* @param contentProperty
* @param globalConfiguration
* @return
*/
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new CellData(value);
}
}
使用时创建对应Excel的Java对象
代码语言:javascript复制@Data
public class BankInfoImportExcelDto {
@ExcelProperty(index = 0,value = "银行ID")
@Min(value = 1 message = "ID不能小于1")
private Long bankId;
@ExcelProperty(index = 1,value = "银行名称")
@NotBlank
private String bankName;
@ExcelProperty(index = 2,value = "银行地址")
private String address;
}
编写Controller
代码语言:javascript复制@PostMapping("/import")
public ResultT importExcel(@RequestParam("file") MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
List<BankInfoImportExcelDto> importBankInfoExcelDtoList = readExcelConvertObjectList(inputStream,ExcelTypeEnum.XLSX,BankInfoImportExcelDto.class);
......
}
JSR303注解
JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。HibernateValidator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
Bean Validation 中内置的 constraint
Constraint | 详细信息 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Hibernate Validator 附加的 constraint
Constraint | 详细信息 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range | 被注释的元素必须在合适的范围内 |