easyexcel--导入导出实现自定义格式转换

自定义格式

我们在数据库设计的时候经常会有枚举类型,如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用户,管理员,注意是英文逗号分隔

 这样单元格会出现下拉框,用户可以直接选择,这样就不会填错了

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 中,我们可以通过自定义行样式策略来设置每行的样式。具体步骤如下: 1. 创建自定义样式类,继承 RowStyleStrategy 类,并实现其 createRowCellStyle 方法。 例如: ``` public class CustomRowStyleStrategy extends RowStyleStrategy { @Override public CellStyle createRowCellStyle(Workbook workbook, boolean isHead, int rowIndex) { CellStyle cellStyle = workbook.createCellStyle(); Font font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 12); cellStyle.setFont(font); if (rowIndex % 2 == 0) { cellStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); } cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); return cellStyle; } } ``` 2. 在写入 Excel 时,使用自定义样式类。 例如: ``` // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 设置自定义样式类 CustomRowStyleStrategy customRowStyleStrategy = new CustomRowStyleStrategy(); // 写入 Excel EasyExcel.write(fileName, dataClass) .head(head) .registerWriteHandler(customRowStyleStrategy) .sheet(sheetName) .doWrite(data); ``` 这样就可以创建自定义的每行样式了。在这个例子中,我们设置了文字字体为宋体,字号为12;奇数行背景色为浅青色;居中对齐;边框为细线。你可以根据自己的需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值