alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.09k stars 7.5k forks source link

EasyExcel支持国际化,在导入的时候,通过覆盖DefaultAnalysisEventProcessor类动态修改列名 #3884

Open YangJingf opened 2 months ago

YangJingf commented 2 months ago

一、实体类

/**
 * 所属国家/地区
 */
@ExcelProperty(value = "所属国家/地区")
private String countryRegion;

二、为了支持中英文

在一个格子里,采用换行的方式,中英文展示。(这里只要是拿到ExcelProperty的中文,然后找到对应的英文翻译,通过 \n 换行的方式,实现中英文在一个格子里面的国际化。) image

三、在导入的时候,通过修改Excel列名的方式,实现和ExcelProperty配置一样的名字

public class EasyExcelListener extends AnalysisEventListener ,在invokeHead方法中修改列名。

@Override
    public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
        for (Integer integer : headMap.keySet()) {
            String[] names = headMap.get(integer).getStringValue().split("\n");
            if (names.length == 2) {
                headMap.get(integer).setStringValue(names[0]);
            }
        }
    }

四、问题——第三步的修改类名不生效

上面替换表头数据是不生效的, 因为在回调invokeHead之前就已经把表头数据build存储在了headMap里, 需要把buildMap放在回调之后。所以利用的方案是利用同全类名(包名和类文件名全部一致)的加载顺序优先级来来覆盖原 class。重写了一次DefaultAnalysisEventProcessor。 请问除了通过全类名覆盖的方式,现在还有其他方式吗? image

YangJingf commented 2 months ago

@zhuangjiaju 大神帮忙看看呢