自定义格式
我们在数据库设计的时候经常会有枚举类型,如0表示普通用户,1表示VIP用户等,这在excel导入的时候,我们会填普通用户而不是0,这样就需要用到自定义格式把普通用户转换成0,我写了一个通用的抽象类,只要继承这个抽象类就能很方便的实现数据转换
定义抽象类
public abstract class EnumStringConverter implements Converter<Integer> {
public abstract String getExp();
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 这里读的时候会调用
*
* @param context
* @return
*/
@Override
public Integer convertToJavaData(ReadConverterContext<?> context) {
String exp = getExp();
String val = StrUtils.convertByExp(context.getReadCellData().getStringValue(), exp, 1);
if (StringUtils.isNotEmpty(val)) return Integer.parseInt(val);
return null;
}
/**
* 这里是写的时候会调用 不用管
*
* @return
*/
@Override
public WriteCellData<?> convertToExcelData(WriteConverterContext<Integer> context) {
String exp = getExp();
if (context.getValue() != null) {
String val = StrUtils.convertByExp(String.valueOf(context.getValue()), exp, 0);
return new WriteCellData<>(val);
}
return new WriteCellData<>("");
}
}
public class StrUtils {
/**
* 解析表达式 0:男,1:女,2:未知,根据0返回男或者男返回0
*
* @param propertyValue 参数值
* @param converterExp 表达式
* @param separator 分隔符,例如逗号
* @param assignment 分隔符,例如冒号
* @param type 模式,0:根据0找男,1:根据男找0
* @return 解析后值
*/
public static String convertByExp(String propertyValue, String converterExp, String separator, String assignment, int type) {
// 根据separator切分成[0:男]
String[] convertSource = converterExp.split(separator);
for (String item : convertSource) {
// 根据assignment切分成[0,男]
String[] itemArray = item.split(assignment);
if (itemArray.length < 2) throw new ServiceFailException("convertByExp字符串格式错误");
if (type == 0) {
if (itemArray[0].equals(propertyValue)) {
return itemArray[1];
}
} else {
if (itemArray[1].equals(propertyValue)) {
return itemArray[0];
}
}
}
return "";
}
public static String convertByExp(String propertyValue, String converterExp, int type) {
return convertByExp(propertyValue, converterExp, ",", ":", type);
}
public static String convertByExp(String propertyValue, String converterExp) {
return convertByExp(propertyValue, converterExp, 0);
}
}
定义继承类
我们只要按照0:普通用户这个格式提供表达式,转换类就能把0转换成普通用户
public class UserEnumConverter extends EnumStringConverter {
@Override
public String getExp() {
return "0:普通用户,1:VIP用户,2:管理员";
}
}
加上自定义格式注解
@ExcelProperty(value = "类型", converter = UserEnumConverter.class)
private Integer type;
效果
数据库存储
导出样式,把0转成普通用户了
导入效果,把普通用户转成0了,导入导出都实现了完美转换
excel单元格设置成下拉
我们在导入的时候,类型这一列不是自由文本,只能输入固定的几个值,这个该如何实现?
先选中类型那一列,然后数据-数据验证,点击数据验证
出来弹框后,选择序列,来源里面填普通用户,VIP用户,管理员,注意是英文逗号分隔
这样单元格会出现下拉框,用户可以直接选择,这样就不会填错了