alibaba/easyexcel

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

Open

#3,884 opened on Jul 15, 2024

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Java (7,599 forks)batch import
help wanted

Repository metrics

Stars
 (33,728 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

一、实体类

/**
 * 所属国家/地区
 */
@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

Contributor guide